Java:如何加载已经在类路径上的类(及其内部类)?

如何加载已经在类路径上的类,实例化它,并实例化其中定义的任何内部类?

例如:

public class TestClass { public class InnerClass { } } 

内部类不能存在于父类之外。 您需要首先构造父类。 没有反思,这看起来像:

 InnerClass innerClass = new TestClass().new InnerClass(); 

在reflection中,您需要在构造内部类时传递父类。

 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 }); } } 

作为旁注,鉴于您的主要问题已得到解答 – 通常人们会像上面的示例中那样声明内部类,而不考虑它们是否可以是静态内部类。

根据我的经验,绝大多数(非匿名)内部类可以是静态的,因为它们不需要访问其父类的实例成员。 在这种情况下将内部类声明为静态更有效(因为运行时不需要为每个父实例定义新类),更少混淆(因为new TestClass().new InnerClass().getClass() != new TestClass().new InnerClass().getClass() )如果没有适当的TestClass实例, new TestClass().new InnerClass().getClass() != new TestClass().new InnerClass().getClass()容易实例化。

所以,如果这适用于你,你可以 (并且可以说)应该如此声明你的内部阶级:

 public class TestClass { public static class InnerClass { } } 

然后你可以简单地将它实例化为new TestClass.InnerClass()

(如果您需要从InnerClass中访问成员字段,那么当然要忽略所有这些!)

 Class.forName("your classname").newInstance(). 

仅当构造函数实例化它们时,才会实例化内部类。