首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态加载子类?

动态加载子类?
EN

Stack Overflow用户
提问于 2011-01-21 05:23:13
回答 1查看 1.1K关注 0票数 0

我需要按类名创建类的实例,问题是这些类恰好是子类(我已经有了父类的实例)。我记得class.forName()不能加载子类。在C++中,我可以使用一个从名称到静态函数指针的查找表来完成这个任务,但是这个动态的子类在Java中是否可能加载呢?

谢谢。

更新

谢谢您的回答,但它似乎不适用于以下示例:

AbStractTest.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
      }
}

它将导致以下错误:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-21 05:35:14

更新的问题更新

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

这样做是可行的:

代码语言:javascript
复制
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");
             }
      }
}

指纹:

代码语言:javascript
复制
inner test class
inner test
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4755689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档