2011-01-21 5 views
0

J'ai besoin de créer des instances de classes par nom de classe, le problème est que ces classes sont des classes enfants (j'ai déjà une instance de la classe parent). Je me souviens que class.forName() ne peut pas charger la classe enfant. En C++, je pourrais utiliser une table de consultation du nom aux pointeurs de fonction statiques pour faire ceci, mais est-ce que ce chargement de classe enfant dynamique est même possible en Java?Charger dynamiquement une classe enfant?

Merci.

MISE À JOUR

Merci pour la réponse, mais il semble qu'il ne fonctionne pas pour l'exemple suivant:

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(); 
     } 
} 
Cela finit par l'erreur suivante:
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

vous que 'Class.forName()' ne fonctionne pas ? – CurtainDog

+0

Quel type de classe enfant avez-vous? Est-ce que votre classe interne est qualifiée avec un modificateur statique ou non? – adatapost

+0

Il échoue parce que le constructeur de test n'est pas public. Voir http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#getConstructor (java.lang.Class ...) – SimonC

Répondre

7

mise à jour pour la mise à jour des questions

GetConstructor() renvoie uniquement les constructeurs publics Les. Vous devez utiliser getDeclaredConstructors() pour obtenir les autres constructeurs non publiques

Cela fonctionne:

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"); 
      } 
     } 
} 

Imprime:

inner test class 
inner test 
+0

Merci, s'il vous plaît voir le poste mis à jour ci-dessus. – murphytalk

+0

Désolé, j'ai mis à jour rapidement. Votre problème actuel est que le constructeur n'est pas public. – SimonC

+0

Oui exactement. Je vous remercie ;) – murphytalk

Questions connexes