gpt4 book ai didi

java - 带有内部类的 newInstance()

转载 作者:搜寻专家 更新时间:2023-10-30 21:43:48 30 4
gpt4 key购买 nike

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

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.<init>()
at java.lang.Class.getConstructor(Unknown Source)
at java.lang.Class.getConstructor(Unknown Source)
at NewTest.main(NewTest.java:12)

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

最佳答案

非静态内部类需要外部类的实例才能正常工作。因此,它们并不“真的”有默认构造函数,它们总是有一种隐藏参数,它们期望在其中有一个外部类实例。

我不知道你为什么要把它们全部放在一个类中。如果您这样做是为了使它只有一个文件,请将它们放在一个包中并放在单独的类中。拥有更少的文件并不能使您的程序变得更好。

相反,如果您需要它们共享某些东西,那么外部类将作为一种“作用域”工作,您仍然可以在不使用内部类的情况下做到这一点,而是通过向它们传递某种上下文。

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

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

关于java - 带有内部类的 newInstance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25634542/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com