我需要按类名创建类的实例,问题是这些类恰好是子类(我已经有了父类的实例)。我记得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");
}
}
}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)发布于 2011-01-21 05:35:14
更新的问题更新
getConstructor()只返回公共构造函数。您需要使用getDeclaredConstructors()来获取其他非公共构造函数。
这样做是可行的:
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 testhttps://stackoverflow.com/questions/4755689
复制相似问题