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

Java 使用反射调用具有参数的内部类方法,java,methods,reflection,Java,Methods,Reflection,我正在尝试测试我的代码,尽管知道使用反射不是一种好的测试方法。我有一个外部类作为public,有一个私有的内部类和一个公共方法,如下所示 public class Outer { private class Inner { private int var = 1; public Inner(int a) { System.out.println("___"); } public void tes

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

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);
}
main(){
外部b=新的外部();
系统输出打印ln(b);
Class innerClass=Class.forName(“car.Outer$Inner”);
构造函数=innerClass.getDeclaredConstructor(Outer.class,1);
constructor.setAccessible(true);
objectc=constructor.newInstance(b,b);
方法Method=c.getClass().getDeclaredMethod(“测试”);
方法setAccessible(true);
方法调用(c,1);
}
这是投掷

线程“main”java.lang.NoSuchMethodException中的异常:car.Outer$Inner.test() 位于java.lang.Class.getDeclaredMethod(Class.java:2130) 在car.A.main(A.java:36)


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

您需要在调用
getDeclaredMethod()
时提供参数类。调用
getDeclaredMethod()
时,第一个参数是要查找的方法的名称,其余任何参数都是所需方法的参数类。这就是
getDeclaredMethod()
区分重载方法名称以获取特定方法的方式。由于您没有提供其他参数,
getDeclaredMethod()
正在寻找一个名为
test
的方法,该方法不接受任何参数。您得到一个异常,因为在类
Outer$Inner
中没有这样的方法。您仅有的
test
方法采用
int
参数,因此以下操作应满足您的要求:

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

这里,
int.class
是与基元参数类型
int
相对应的
class
对象。您可以检查您的方法是否在类中吗?它仅在类中。这同样适用于没有参数的方法。您需要在调用
getDeclaredMethod()
时提供参数类。在这种情况下,
c.getClass().getDeclaredMethod(“test”,int.class)
应该会起作用。你是救生员。谢天谢地:-)看起来今天已经有人问了这样一个问题:在这种情况下,OP更进一步了。