Java - 获取传递给方法的参数?

时间:2012-12-27 08:09:59

标签: java reflection aop

是否可以使用reflection api将参数传递给Java中的方法?

是否可以使用像AspectJ这样的AOP库实现这一目标?

我在Android上运行。

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

2 个答案:

答案 0 :(得分:3)

  

是否可以使用像AspectJ这样的AOP库实现这一目标?

是的,当然。这是AspectJ中典型的初学者练习,如下所示:

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

现在你只需编写一个截取所有方法执行的方面(以及可选的构造函数执行,如下所示):

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

答案 1 :(得分:1)

你可以使用 java变量参数来获得这个逻辑

因为我不确定它是否可以在反思中完成

我会做这个替代

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
}