2012-12-27 6 views
5

Czy można uzyskać przekazywanie argumentów do metody w Javie za pomocą aplikacji Reflect API?Java - pobiera argumenty przekazane do metody?

Czy można to osiągnąć za pomocą bibliotek AOP, takich jak AspectJ?

Używam Androida.

public abstract class Base { 

    public void printArguments() { 

     //Here I need to get access to arg1, arg2, arg3 
    } 

} 

.

public class MyClass extends Base { 

    public void (String arg1, Integer arg2, String arg3) { 

     super.printArguments();  
    } 
} 
+0

są u próbuje wydrukować dowolną liczbę argumentów comming jako parametr w jednym metody? –

+0

Tak, projektuję warstwę pamięci podręcznej dla mojej aplikacji i chciałbym użyć nazwy klasy, nazwy metody, argumentów i adnotacji (CacheForMinute) jako klucza – aryaxt

Odpowiedz

3

Czy można to osiągnąć przy użyciu biblioteki AOP jak AspectJ?

Tak, jasne. Jest to rodzaj ćwiczeń typowego początkującego w AspectJ, tak:

public class SampleClass { 
    public SampleClass() { super(); } 
    public SampleClass(String s) { this(); } 
    public SampleClass(int i) { this(); } 
    public void method01(String s, Number n, Throwable t) {} 
    public void method02(int i, String s, double d) {} 
    public void method03(String s) {} 
    public void method04() {} 
    public void method05(String s, Number n, double d) {} 

    public static void main(String[] args) { 
     new SampleClass().method01("foo", new Integer(11), new RuntimeException("error")); 
     new SampleClass("test").method02(11, "bar", Math.PI); 
     new SampleClass(123).method03("zot"); 
     new SampleClass("another test").method04(); 
     new SampleClass(456).method05("baz", new Integer(11), Math.E); 
    } 
} 

Teraz wystarczy napisać aspekt, który przechwytuje wszystkie egzekucje metodą (i ewentualnie także egzekucje konstruktora, tak jak pokazano poniżej):

public aspect MethodArgsAspect { 
    pointcut allMethods()  : execution(* *(..)); 
    pointcut allConstructors() : execution(*.new(..)); 

    before() : !within(MethodArgsAspect) && (allMethods() || allConstructors()) { 
     System.out.println(thisJoinPointStaticPart.getSignature()); 
     for (Object arg : thisJoinPoint.getArgs()) 
      System.out.println(" " + arg); 
    } 
} 

Uruchamiając SampleClass.main, ten aspekt będzie drukować:

void SampleClass.main(String[]) 
    [Ljava.lang.String;@7fdcde 
SampleClass() 
void SampleClass.method01(String, Number, Throwable) 
    foo 
    11 
    java.lang.RuntimeException: error 
SampleClass() 
SampleClass(String) 
    test 
void SampleClass.method02(int, String, double) 
    11 
    bar 
    3.141592653589793 
SampleClass() 
SampleClass(int) 
    123 
void SampleClass.method03(String) 
    zot 
SampleClass() 
SampleClass(String) 
    another test 
void SampleClass.method04() 
SampleClass() 
SampleClass(int) 
    456 
void SampleClass.method05(String, Number, double) 
    baz 
    11 
    2.718281828459045 
+0

będzie przechwytywać wszystkie metody programu. Czy jest jakiś sposób, aby zrobić to dynamicznie, gdy aplikacja jest uruchomiona i istnieje potrzeba określenia wartości parametru metody, która jest przekazywana? – Nitul

+0

Z przyjemnością odpowiem na twoje pytanie, jeśli (a) utworzysz nowy zamiast go porwać, ponieważ chcesz czegoś innego niż to, o co tu pytano i odpowiedziałeś i (b) zadajesz pytanie w sposób, który mogę zrozumieć. , również dostarczając przykładowy kod przykładowy (wykonalny, jeśli to możliwe), więc muszę coś dla ciebie naprawić lub zaimplementować. Możesz dodać link do nowego pytania w innym komentarzu tutaj, więc mogę go znaleźć. Dziękuję Ci bardzo. – kriegaex

1

Można by Ci java zmienna argumentem do realizacji tej logiki

ponieważ nie jestem pewien, czy można to zrobić w refleksji

musiałbym zrobić to alternatywa

www.java.net/pub/a/today/2004/04/19/varargs.html

gdzie twoja metoda

public void printArguments(Obeject... argArr) { 

    //Here I need to get access to arg1, arg2, arg3 
    //TODO iterate over object array (ie: argArr) and print it. 
    } 

aw swojej klasie sub

public void someMethodName(String arg1, Integer arg2, String arg3) { 

    super.printArguments(arg1,arg2); 
    super.printArguments(arg1,arg2,arg3);  //the print argument can be called with any number of argument 
} 
+0

Nie lubię tego robić, wolę wszystko zautomatyzowane, ale jeśli nie uda mi się uruchomić jakiejś metody przechwytywania metod, mógłbym pójść z tym. Dzięki – aryaxt