Java: How to load a class (and its inner classes) that is already on the class path?

怎甘沉沦 提交于 2019-12-18 06:02:21

问题


How can I load a class that is already on the class path, instantiate it, and also instantiate any inner classes defined within it?

EG:

public class TestClass {


    public class InnerClass { }

}

回答1:


Inner classes cannot exist outside the parent class. You need to construct the parent class first. Without reflection this would look like:

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

In reflection, you need to pass the parent class in during construction of the inner class.

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



回答2:


As a side note, given that your primary question has been answered - often people will declare inner classes as in your example above, without giving a thought to whether they can be static inner classes instead.

In my experience, the vast majority of (non-anonymous) inner classes can be static, as they don't need to access their parent class' instance members. Declaring the inner class as static in this case is both more efficient (as the runtime doesn't need to define a new class for each parent instance), less confusing (since new TestClass().new InnerClass().getClass() != new TestClass().new InnerClass().getClass()) and easier to instantiate if you don't have an appropriate instance of TestClass handy.

So if this applies to you, you could (and arguably should) declare you inner class thusly:

public class TestClass {

    public static class InnerClass { }

}

and then you can simply instantiate it as new TestClass.InnerClass().

(If you need to access member fields from within InnerClass, then just ignore all this of course!)




回答3:


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

The inner classes will be instantiated only if the constructor instantiates them.



来源:https://stackoverflow.com/questions/2868337/java-how-to-load-a-class-and-its-inner-classes-that-is-already-on-the-class-p

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!