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

Zom*_*ies 7 java reflection classloader

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

例如:

public class TestClass {


    public class InnerClass { }

}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 15

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

InnerClass innerClass = new TestClass().new InnerClass();
Run Code Online (Sandbox Code Playgroud)

在反射中,您需要在构造内部类时传递父类.

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 });
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*yle 7

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

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

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

public class TestClass {

    public static class InnerClass { }

}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是的,就像`final`变量一样,它可以说*应该是语言级别的默认值 - 所以相反,需要将它作为习惯级别的默认值. (2认同)