2011-01-21 130 views
0

我需要通過類名創建類的實例,問題是這些類碰巧是子類(我已經有了一個父類的實例)。我記得class.forName()不能加載子類。在C++中,我可以使用從名稱到靜態函數指針的查找表來執行此操作,但是這種動態子類加載甚至可能在Java中加載?動態加載兒童班?

謝謝。

UPDATE

感謝您的回答,但看起來它並不適用於下面的示例工作:

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) 
+0

你確定'的Class.forName()`不工作? – CurtainDog 2011-01-21 05:32:37

+0

你有哪一類孩子?你的內部類是否符合靜態修飾符? – adatapost 2011-01-21 05:41:03

回答

7

更新了問題更新

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 test