Avatar billede themepark Nybegynder
07. december 2005 - 18:50 Der er 7 kommentarer og
1 løsning

Tjekke om en metode er kaldt fra en anden metode.

Findes der en måde fra Java API'en til indeni en metode at tjekke om den er blevet kaldt af en anden metode fra samme klasse. Lige nu har jeg en midlertidig løsning med et boolean array, men jeg ville foretrække hvis der var noget fra API'en der kunne bruges.
Avatar billede arne_v Ekspert
07. december 2005 - 20:07 #1
se det her eksempel for nogle ideer:

public class Tracer {
  public static void whereAmI() {
      Exception ex = new Exception();
      StackTraceElement[] ste = ex.getStackTrace();
      for(int i = 0; i < ste.length; i++) {
        System.out.println(ste[i].getMethodName());
      }
  }
  public static void subbo() {
      whereAmI();
  }
  public static void main(String[] args) {
      subbo();
  }
}
Avatar billede arne_v Ekspert
07. december 2005 - 20:14 #2
PS: det koster i performance

Man kan lave noget smart med AspectJ hvis du er frisk p[ lidt AOP !
Avatar billede themepark Nybegynder
07. december 2005 - 20:16 #3
AOP?
Avatar billede arne_v Ekspert
07. december 2005 - 20:20 #4
Aspect Oriented Programming
Avatar billede thomaswinterberg Nybegynder
07. december 2005 - 22:27 #5
Giver arne ret AOP er godt til bl.a. at trace hvilke metoder der bliver kaldt/eksekveret returneret fra osv. AOP findes bl.a til C++, Java og .NET. Til java kan du bruge AspectJ som er en udvidelse tilæ Java. AspectJ compilereren("ajc") producerer klasser der kan køre på Java platforme 1.1 eller senere. Der findes et udmærket plugin til Eclipse.

Du kan jo kigge på http://eclipse.org/aspectj/

Smider lige et lille eksempel:

//Simple kalder metoden printMessage()
public class Simple
{
    public void printMessage()
    {
    System.out.println("Hello World");
    }

    public static void main(String argv[])
    {
    Simple obj = new Simple();
    obj.printMessage();
    }
}


/*
* min aspect source kode.
*
* jeg holder øje med kald til metoden printMessage i klassen Simple.
* metoden har signaturen: void og ingen indparametre
*/

spect Trace
{
pointcut printOuts(): // navngivet pointcut printOuts
  call(void Simple.printMessage());


before(): printOuts() // before advice
{
  System.out.println("-> Before Calling");
}

after(): printOuts() // after advice
{
  System.out.println("<- after Calling");
}

}

Der er bl.a. 2 ting at bemærk i dette eksempel

Pointcut:

Udvælger bestemte punkter ved eksekvering af et program("join points"). Punkter er f.eks: kald til en metode, returnering fra en metode, eksekvering af en metode osv ...

Advice:
Et pointcut udvælger kun punkter. For at udføre noget ved et punkt
skal der implementeres opførstel. Dette gøres med et advice. Et advice kan   
sammenlignes med en metode i Java


Udskriften vil se således ud i en console:

-> Before Calling
Hello World
<- after Calling

Dette er kun meget lidt information med skulle give dig en ide om hvad AOP/AspectJ er.


NB: er ikke ude efter point. Håber såmænd bare at andre også kommer til at synes at AOP er et nyttigt paradigme :-)
Avatar billede themepark Nybegynder
08. december 2005 - 12:22 #6
Ja ja, jeg skal da love for at man får mulighed for at optimere nogle ting, når man stiller spørgsmål herinde :D Jeg klarer mig nu fint nok med Java, jeg kunne sagtens bruge det ovennævnte eksempel i min kode, så smid endelig et svar, arne :)
Avatar billede arne_v Ekspert
08. december 2005 - 14:35 #7
kommer her
Avatar billede jakoba Nybegynder
09. december 2005 - 05:26 #8
Hmm. Hvad med:

    StackTraceElement[] minStackTrace = {};
    try {
        throw new Exception();
    } catch( Exception e ) {
        minStackTrace = e.getStackTrace();
    }

se også http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StackTraceElement.html

mvh JakobA
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester