java - 使用反射调用具有参数的内部类方法

标签 java methods reflection

我正在尝试测试我的代码,尽管我知道使用反射不是一种好的测试方法。我有一个公共(public)的外部类,具有如下所示的公共(public)方法的私有(private)内部类,

public class Outer {

    private class Inner {
        private int var = 1;

        public Inner(int a) {
            System.out.println("___");
        }

        public void test(int a) {
            System.out.println("Hey");
        }
    }
}

我的主要 java 类如下所示

main() {
    Outer b = new Outer();
    System.out.println(b);
    Class<?> innerClass = Class.forName("car.Outer$Inner");

    Constructor<?> constructor = innerClass.getDeclaredConstructor(Outer.class, 1);

    constructor.setAccessible(true);
    Object c = constructor.newInstance(b,b);

    Method method = c.getClass().getDeclaredMethod("test");
    method.setAccessible(true);
    method.invoke(c, 1);
}

这是 throw

Exception in thread "main" java.lang.NoSuchMethodException: car.Outer$Inner.test() at java.lang.Class.getDeclaredMethod(Class.java:2130) at car.A.main(A.java:36)

如何使用反射调用带参数的内部类方法?

最佳答案

您需要在调用 getDeclaredMethod() 时提供参数类。当您调用 getDeclaredMethod() 时,第一个参数是您要查找的方法的名称,其余参数是您想要的方法的参数类。这就是 getDeclaredMethod() 区分重载方法名称以获取特定方法的方式。由于您没有提供额外的参数,getDeclaredMethod() 正在寻找一个名为 test 的方法,该方法不带任何参数。你得到一个异常,因为你在类 Outer$Inner 中没有这样的方法。您拥有的唯一 test 方法采用 int parameter`,因此以下内容应该可以满足您的要求:

Method method = c.getClass().getDeclaredMethod("test", int.class);

这里,int.class是原始参数类型int对应的Class对象。

关于java - 使用反射调用具有参数的内部类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52530923/

相关文章:

c# - .Net 中的方法重载成本

java - 在工厂中使用反射

java - 如何使所有语言的 View 顺序相同

java - 如何将SIGINT传递给用java创建的进程?

java - 如何在扩展Application类的类中的静态方法中调用getApplicationContext?

c# - 有什么方法可以匹配 Visual Fox Pro 和 C#.Net 的 RAND(INT) 方法

Java Applet 411 内容长度

java - 确定 LayoutManager 预布局中出现的 View

javascript - 访问 Angular 分量元数据

c# - 如何传递多个通用参数