带有内部类的newInstance()

Non*_*ter 11 java reflection instantiation inner-classes

我一直在研究一种实例化方法,它允许我将各种类似的类打包到一个外部类中.然后,我可以通过将该类型的名称传递给构造函数来实例化每个唯一的类类型.经过大量的研究和错误,这就是我想出的.我留下了一个错误,以证明我的问题.

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

按照我的意图编译此代码并java NewTest two在输出中运行结果Test2.

运行java NewTest one结果

java.lang.NoSuchMethodException: NewTest$one.<init>()
        at java.lang.Class.getConstructor(Unknown Source)
        at java.lang.Class.getConstructor(Unknown Source)
        at NewTest.main(NewTest.java:12)
Run Code Online (Sandbox Code Playgroud)

我对此感到困惑,因为据我所知,我正确地引用了一个内部类,外部类应该可以访问内部类,并且我有一个默认的没有arg构造函数.

Sim*_*nni 20

非静态内部类需要外部类的实例才能正常工作.因此,它们并非"真正"拥有默认构造函数,它们总是有一种隐藏参数,它们期望外部类实例.

我不知道你为什么要把它们全部放在一个班级里.如果您这样做只有一个文件,请将它们放在一个包中并放在不同的类中.拥有较少的文件并不能使您的程序更好.

相反,如果您需要它们共享某些内容,那么外部类将作为一种"范围"工作,您仍然可以在不使用内部类的情况下执行此操作,而是通过向它们传递某种上下文.

如果你真的想要实例化内部类,则需要使用隐藏的构造函数将外部类作为参数:

NewTest outer = new NewTest();
Class<?> toRun = Class.forName("NewTest$" + args[0]);
Constructor<?> ctor = toRun.getDeclaredConstructor(NewTest.class);
ctor.newInstance(outer);
Run Code Online (Sandbox Code Playgroud)


The*_*111 6

如果没有其父类的实例,则无法实例化非静态内部类。

new NewTest().new one()
Run Code Online (Sandbox Code Playgroud)

上面的调用将成功实例化一个one.

由于修饰符的原因,您的two实例化没有外部实例static。它是一个静态嵌套类

查看静态嵌套类和内部类之间的区别:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html