【问题标题】:Java reflection - Call a static method of a generic class that has private constructorJava 反射 - 调用具有私有构造函数的泛型类的静态方法
【发布时间】:2017-01-17 13:59:54
【问题描述】:

我正在编写一个 java 模板来测试我的类的方法。 要测试的类有一个私有构造函数和静态方法:

public class ProdClass {
  private ProdClass() {
  }

  public static EnumType myMethod() {
    // do something
  }
}

在我用于测试的模板类中,我使用 java 反射编写了这段代码:

String className = "com.myproject.mypackage.ProdClass";
String testMethodName = "myMethod";
Object[] obj = {};

... OTHER CODE FOR RENDERING ...

Class<?> params[] = new Class[obj.length];
for (int i = 0; i < obj.length; i++) {
    if (obj[i] instanceof Integer) {
        params[i] = Integer.TYPE;
    } else if (obj[i] instanceof String) {
        params[i] = String.class;
    } else if (obj[i] instanceof EnumType) {
        params[i] = EnumType.class;
    }
}

Class<?> cls = null;
Method testMethod = null;

try {
    cls = Class.forName(className);
    testMethod = cls.getDeclaredMethod(testMethodName, params);
} catch (NoSuchMethodException e1) {
     e1.printStackTrace();
 } catch (SecurityException e1) {
    e1.printStackTrace();
 } catch (ClassNotFoundException e1) {
     e1.printStackTrace();
}

Object resultTest = null;
try {
        resultTest = testMethod.invoke(cls.newInstance(),obj);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
    e.printStackTrace();
}

if (resultTest != null) {
    System.out.println(" Result: " + resultTest.toString());
}

但我收到以下错误:

java.lang.IllegalAccessException: Class com.myproject.testpackage.TestTemplate$1$1 can not access a member of class com.myproject.mypackage.ProdClass with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at com.myproject.testpackage.TestTemplate$1$1.run(TestTemplate.java:264)
at java.lang.Thread.run(Unknown Source)

因为我有一个私有构造函数。 有人知道如何在不公开构造函数的情况下解决问题吗?

非常感谢。

【问题讨论】:

  • 在反射对象模型的某处有一个setAccessible 函数可用。
  • 请注意,调用静态方法时不必传递实例,只需传递null 即可,因为无论如何该实例都不用于静态方法。因此,如果方法是静态的(Modifier.isStatic(testMethod.getModifiers())),您不必调用任何构造函数,只需执行testMethod.invoke(null, params)
  • 太好了,有效!!!我现在明白我的错误了。

标签: java reflection


【解决方案1】:

尝试替换

        resultTest = testMethod.invoke(cls.newInstance(),obj);

        Constructor constructor = constructor.getConstructor();
        constructor.setAccessible(true);
        resultTest = testMethod.invoke(constructor.newInstance(),obj);

【讨论】:

    【解决方案2】:

    试试:

    Constructor constructor = cls.getConstructor();
    constructor.setAccessible(true);
    constructor.newInstance();
    

    【讨论】:

    • 你比我早 12 秒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多