Java Reflection API。如果不公开,则无法实例化内部类

时间:2015-10-22 11:39:28

标签: java reflection

请帮我反思api。我不能实例化内部类,如果它没有"公共"修改。 我有课程:

public abstract class AbstractClass {
  String str;
    public AbstractClass (String str) {
        this.str = str;
    }
  abstract void process(String str);
}

public class Outer {  

  class Inner extends AbstractClass{
    Inner(String str) {
        super(str);
    }

    @Override
    void process(String str) {
        //doSmth
    }
  }
}

我在另一个地方有这样的方法:

void fillArray (AbstractClass innerAbstract) {
    try {
        ArrayList<AbstractClass> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Object outerClazz = Class.forName(innerAbstract.getClass().getEnclosingClass().getName()).newInstance();
            Class<?> innerReal = Class.forName(innerAbstract.getClass().getName());
            Constructor<?> ctor = innerReal.getConstructor(outerClazz.getClass(), String.class);
            AbstractClass resultClass = (AbstractClass) ctor.newInstance(outerClazz, innerReal.getName());
            list.add(resultClass);
            resultClass.process("STR");
        }
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
            NoSuchMethodException | SecurityException | IllegalArgumentException |
            InvocationTargetException ex) {
        ex.printStackTrace();
    }

}

内部类 - 是AbstractClass的实现。 AbstractClass将在不同的包和类中有很多这样的实现。

问题是。当内部类具有 public 修饰符时,一切正常。但它绝不公开。当内部类具有公共修饰符时,我可以使用 innerReal.getConstructors()获取其构造函数的列表。

但是当我们删除Inner的公共修饰符时 - 构造函数列表变为空。反射api让我用forName()方法得到内部类,但我不能用构造函数获取它的实例,因为它没有任何一个。

提前感谢您的帮助! =)

2 个答案:

答案 0 :(得分:1)

试试getDeclaredConstructors(),它可以帮到你。

答案 1 :(得分:1)

您忘记将构造函数设置为可访问

这应该有效:

Constructor<?> ctor = innerReal.getConstructor(outerClazz.getClass(), String.class);
ctor.setAccessible(true); // can throw some sort of Exception
AbstractClass resultClass = (AbstractClass) ctor.newInstance(outerClazz, innerReal.getName());