【问题标题】:Invoke Inner class method having parameters using reflection使用反射调用具有参数的内部类方法
【发布时间】:2019-03-03 00:15:15
【问题描述】:

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

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”中的异常 java.lang.NoSuchMethodException: car.Outer$Inner.test() 在 java.lang.Class.getDeclaredMethod(Class.java:2130) 在 car.A.main(A.java:36)

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

【问题讨论】:

  • 你能检查你的方法是否在课堂上吗?
  • 仅在课堂内。没有参数的方法也是如此。
  • 您需要在对getDeclaredMethod() 的调用中提供参数类。在这种情况下,c.getClass().getDeclaredMethod("test", int.class) 应该可以工作。
  • 你是救生员。谢谢你:-)
  • 今天好像有人问过这样的问题:Java reflection: access private method inside inner class 在这种情况下,OP 更进一步。

标签: java methods reflection


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2011-12-06
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多