当前位置: 首页 > 面试题库 >

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

云韬
2023-03-14
问题内容

是否可以使用反射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();      
   }
}

问题答案:

是否可以使用诸如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


 类似资料:
  • 问题内容: 在java中,可以获取调用当前方法的类和方法(在其中获得StackTrace的方法)。 我的问题是,我可以获取传递给调用此方法的方法的参数吗? 我需要此来进行调试。 例如: 可以从堆栈跟踪中获取此信息,还是有其他方法? (请注意,我需要能够在运行时执行此操作,并且实际上不能更改baseClass的源,这将成为我的调试类的功能,该类事先不知道源) 谢谢。 问题答案: 我认为使用标准Jav

  • 我想从另一个作业中获取参数,就像我们从另一个作业中复制工件一样。 考虑2个詹金斯作业A和B。拉链制品。 我的要求:我希望作业B将所有参数传递给作业A中的构建#30。(我使用复制工件插件从作业A的#30复制.zip)如何从不同的jenkins作业获取参数?

  • 问题内容: 我很好奇Go中是否有可能。我有多种方法的类型。是否可以有一个函数,该函数需要一个方法参数,然后将其称为类型? 这是我想要的一个小例子: Go认为type 有一个称为的方法,而不是用传入的方法名称替换它。 问题答案: 是的,有可能。您有2(3)个选项: 规范:方法表达式 该表达式产生的功能与第一个参数等效,但具有一个显式接收器。它有签名。 在这里,方法接收器是显式的。您只需将方法名称(具

  • 有时对一个类的某些方面进行 参数化(parameterize)是很有用的。例如, 你可能需要管理不同版本的 gem 软件包,既可以为每一种版本创建分离的单独的类, 也可以使用继承和覆盖,为一个类传递一个版本号作为参数。 操作步骤 声明参数作为如下类定义的一部分: class eventmachine( $version ) { package { "eventmachine": pro

  • 问题内容: 我正在使用testNG,Selenium和Jenkins建立测试自动化框架。该代码工作正常,它读取一个或多个csv文件并将其用作测试数据。我从詹金斯进行测试。 如您所见,浏览器,URL和CSV文件是硬编码的。我希望能够将这些作为参数传递。做这个的最好方式是什么?是否可以让他们通过詹金斯? 我正在考虑构建一个仪表板,在其中可以指定要使用哪种浏览器运行哪些测试(csv文件)。 这是我正在运

  • 问题内容: 如何将整个数组传递给方法? 如何正确执行此操作? 问题答案: 你做这个: 只需将其作为其他任何变量传递即可。 在Java中,数组是通过引用传递的。