2012-12-27 26 views
5

リフレクションAPIを使用してJavaのメソッドに引数を渡すことはできますか?Java - メソッドに渡される引数を取得しますか?

AspectJのようなAOPライブラリを使用してこれを達成することは可能ですか?

Androidで実行しています。

public abstract class Base { 

    public void printArguments() { 

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

} 

あなたはあなたに私はそれが反射

で行うことができる場合、私はこの代替

を行っているだろうことを確認していないので、このロジック

を達成するためのJava変数引数をできた

public class MyClass extends Base { 

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

     super.printArguments();  
    } 
} 
+0

uは、単一のメソッドにパラメータとして来て任意の数の引数を印刷しようとしていますか? –

+0

はい、アプリケーションのキャッシュレイヤーを設計しています。クラス名、メソッド名、引数、および注釈(CacheForMinute)をキーとして使用したいと考えています。 – aryaxt

答えて

3

それはAspectJのように、この使用してAOPライブラリを達成することは可能ですか?

ええ、確かに。 (以下に示すように、必要に応じても、コンストラクタの実行)

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); 
    } 
} 

が今、あなただけのすべてのメソッドの実行をインターセプト側面を記述する必要があります:

これは、AspectJの中に、典型的な初心者の運動の種類、そのようなものです
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); 
    } 
} 

SampleClass.mainを実行している場合は、この態様は印刷されます:

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

それはプログラムのすべてのメソッドを横取りします。アプリケーションが実行されている間に動的に行う方法はありますか?渡されるメソッドのパラメータ値を識別する必要がありますか? – Nitul

+0

私はあなたの質問に答えてくれることを嬉しく思っています。(a)あなたがここで尋ねられ答えられたものと違う何かをしたいので、これをハイジャックするのではなく新しいものを作成し、(b)また、サンプルコードのサンプル(可能な場合は実行可能)を提供していますので、実際に修正したり実装したりすることがあります。ここで別のコメントに新しい質問へのリンクを追加することができますので、私はそれを見つけることができます。どうもありがとうございました。 – kriegaex

1

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

あなたのメソッド

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. 
    } 

とあなたのサブクラスで

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

私はこれをやっていない、自動化されていますが、何らかの方法で傍受してもうまくいかない場合、私はこれを行うかもしれません。おかげで – aryaxt

関連する問題