带有内部类的newInstance()
我一直在研究一种实例化方法,它允许我将各种类似的类打包到一个外部类中。 然后,我可以通过将该类型的名称传递给构造函数来实例化每个唯一的类类型。 经过大量的研究和错误,这就是我想出的。 我留下了一个错误,以certificate我的问题。
import java.lang.reflect.Constructor; public class NewTest { public static void main(String[] args) { try { Class toRun = Class.forName("NewTest$" + args[0]); toRun.getConstructor().newInstance(); } catch(Exception ex) { ex.printStackTrace(); System.out.println(ex.getMessage()); } } public NewTest(){} private class one //Does not instantiate { public one() { System.out.println("Test1"); } } private static class two //Instantiates okay { public two() { System.out.println("Test2"); } } }
正如我的意图,编译此代码并运行java NewTest two
导致输出Test2
。
运行java NewTest one
结果
java.lang.NoSuchMethodException: NewTest$one.() at java.lang.Class.getConstructor(Unknown Source) at java.lang.Class.getConstructor(Unknown Source) at NewTest.main(NewTest.java:12)
我对此感到困惑,因为据我所知,我正确地引用了一个内部类,外部类应该可以访问内部类,并且我有一个默认的没有arg构造函数。
非静态内部类需要外部类的实例才能正常工作。 因此,它们并非“真正”拥有默认构造函数,它们总是有一种隐藏参数,它们期望外部类实例。
我不知道你为什么要把它们全部放在一个class级里。 如果您这样做只有一个文件,请将它们放在一个包中并放在不同的类中。 拥有较少的文件并不能使您的程序更好。
相反,如果您需要它们来共享某些内容,那么外部类将作为一种“范围”工作,您仍然可以在不使用内部类的情况下执行此操作,而是通过向它们传递某种类型的上下文。
如果你真的想要实例化内部类,则需要使用隐藏的构造函数将外部类作为参数:
NewTest outer = new NewTest(); Class> toRun = Class.forName("NewTest$" + args[0]); Constructor> ctor = toRun.getDeclaredConstructor(NewTest.class); ctor.newInstance(outer);
如果没有父类的实例,则无法实例化非静态内部类。
new NewTest().new one()
上面的调用将成功实例化one
。
由于static
修饰符,你的two
实例化没有外部实例。 它是一个静态嵌套类 。
查看静态嵌套类和内部类之间的区别: http : //docs.oracle.com/javase/tutorial/java/javaOO/nested.html
你需要使第一类静态。 必须使用包含类的实例来实例化非静态嵌套类。