gpt4 book ai didi

java - 动态加载子类?

转载 作者:行者123 更新时间:2023-12-01 07:41:08 24 4
gpt4 key购买 nike

我需要通过类名创建类的实例,问题是这些类恰好是子类(我已经有父类的实例)。我记得 class.forName() 无法加载子类。在 C++ 中,我可以使用从名称到静态函数指针的查找表来执行此操作,但是这种动态子类加载在 Java 中是否可能?

谢谢。

更新

感谢您的回答,但看起来它不适用于以下示例:

AbStractTest.java

public abstract class AbstractTest{
AbstractTest(int i){}
class InnerTest
{
InnerTest(){
System.out.println("inner test class");
}
void test(){
System.out.println("inner test");
}
}
}

测试.java

public class Test extends AbstractTest
{
Test(int i){
super(i);
}
public static void main(String[] args) throws Exception
{
Test t = new Test(1);
AbstractTest.InnerTest innerTest = (AbstractTest.InnerTest)Class.forName("AbstractTest$InnerTest").getConstructor(AbstractTest.class).newInstance(t);
innerTest.test();
}
}

最终出现以下错误:

Exception in thread "main" java.lang.NoSuchMethodException: AbstractTest$InnerTest.<init>(AbstractTest)
at java.lang.Class.getConstructor0(Class.java:2678)
at java.lang.Class.getConstructor(Class.java:1629)
at Test.main(Test.java:9)

最佳答案

已更新问题更新

getConstructor() 仅返回公共(public)构造函数。您需要使用 getDeclaredConstructors() 来获取其他非公共(public)构造函数

这有效:

import java.lang.reflect.Constructor;

public class Test extends AbstractTest
{
Test(int i){
super(i);
}
public static void main(String[] args) throws Exception
{
Test t = new Test(1);
final Constructor<?>[] constructors = Class.forName("AbstractTest$InnerTest").getDeclaredConstructors();
Constructor<?> noArgConstructor = null;
for (final Constructor<?> constructor : constructors)
{
if (constructor.getParameterTypes().length == 1)
noArgConstructor = constructor;
}
if (noArgConstructor == null)
throw new RuntimeException("Failed to find no arg constructor");

AbstractTest.InnerTest innerTest = (AbstractTest.InnerTest) noArgConstructor.newInstance(t);

innerTest.test();
}
}

abstract class AbstractTest{
AbstractTest(int i){}
class InnerTest
{
InnerTest(){
System.out.println("inner test class");
}
void test(){
System.out.println("inner test");
}
}
}

打印:

inner test class
inner test

关于java - 动态加载子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755689/

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