如何加载已经在类路径上的类,实例化它,并实例化其中定义的任何内部类?
EG:
public class TestClass {
public class InnerClass { }
}
答案 0 :(得分:14)
内部类不能存在于父类之外。您需要首先构造父类。没有反思,这看起来像:
InnerClass innerClass = new TestClass().new InnerClass();
在反射中,您需要在构造内部类时传递父类。
Object testClass = Class.forName("com.example.TestClass").newInstance();
for (Class<?> cls : testClass.getClass().getDeclaredClasses()) {
// You would like to exclude static nested classes
// since they require another approach.
if (!Modifier.isStatic(cls.getModifiers())) {
Object innerClass = cls
.getDeclaredConstructor(new Class[] { testClass.getClass() })
.newInstance(new Object[] { testClass });
}
}
答案 1 :(得分:6)
作为旁注,鉴于您的主要问题已得到解答 - 通常人们会像上面的示例中那样声明内部类,而不考虑它们是否可以是静态内部类。
根据我的经验,绝大多数(非匿名)内部类可以是静态的,因为他们不需要访问其父类的实例成员。在这种情况下将内部类声明为静态更有效(因为运行时不需要为每个父实例定义新类),更少混淆(因为new TestClass().new InnerClass().getClass() != new TestClass().new InnerClass().getClass()
)并且如果你不喜欢则更容易实例化t有一个适当的TestClass
实例。
所以,如果这适用于你,那么可以(并且可以说)应该如此声明你的内部类:
public class TestClass {
public static class InnerClass { }
}
然后您可以简单地将其实例化为new TestClass.InnerClass()
。
(如果你需要从InnerClass中访问成员字段,那么当然要忽略所有这些!)
答案 2 :(得分:1)
Class.forName("your classname").newInstance().
只有构造函数实例化它们时才会实例化内部类。