2010-04-02 3 views
3

Je veux utiliser la réflexion dans Java, je veux faire que la troisième classe lise le nom de la classe en tant que chaîne de la console. En lisant le nom de la classe, elle générera automatiquement et dynamiquement (!) Cette classe et appellera sa méthode writeout. Si cette classe n'est pas lue en entrée, elle ne sera pas initialisée.Création dynamique de classe à l'aide de Java Reflection, java.lang.ClassNotFoundException

J'ai écrit que les codes, mais je prends toujours à "java.lang.ClassNotFoundException", et je ne sais pas comment je peux le réparer. Quelqu'un peut-il m'aider?

class class3 { 
    public Object dynamicsinif(String className, String fieldName, String value) throws Exception 
    {  
     Class cls = Class.forName(className,true,null);  
     Object obj = cls.newInstance();  
     Field fld = cls.getField(fieldName);  
     fld.set(obj, value);  
     return obj;  
    } 

    public void writeout3()  
    {  
     System.out.println("class3");  
    }  
} 

public class Main {   
    public static void main(String[] args) throws Exception  
    {    
      System.out.println("enter the class name : ");  
     BufferedReader reader= new BufferedReader(new InputStreamReader(System.in)); 
      String line=reader.readLine();  
      String x="Text1";  
      try{  
       class3 trycls=new class3();  
       Object gelen=trycls.dynamicsinif(line, x, "rubby");  
       Class yeni=(Class)gelen;   
       System.out.println(yeni);      
      }catch(ClassNotFoundException ex){   
       System.out.print(ex.toString());  
      }  
    }  
} 
+0

Indente que vous codez avec 4 espaces et supprimez les lignes vides afin qu'il soit plus facile à lire – Progman

+1

L'utilisation du caractère "ı" pour désigner "I" une chose d'internationalisation? –

Répondre

6

Java lancera une ClassNotFoundException lorsque vous essayez de réfléchir à un nom de classe et une classe avec ce nom ne peut pas se trouver dans le chemin de classe. Vous devez vous assurer que la classe que vous essayez d'instancier est sur le chemin de classe et que vous utilisez son nom complet (ex: java.lang.String au lieu de simplement String)

EDIT: vous n'avez pas besoin d'utiliser la méthode des 3 arg forName sur Class. Au lieu de cela, utilisez le 1 arg forName qui prend uniquement le nom de classe que vous transmettez.

4

Une erreur courante lors de la tentative d'instanciation d'un objet par réflexion consiste à transmettre uniquement le nom de classe, pas le nom complet. En d'autres termes, l'utilisation de "String" au lieu de "java.lang.String" ne fonctionnera pas. De plus, sachez que votre code ne fonctionnera que pour les classes qui ont un constructeur par défaut (ou sans argument). Si vous rencontrez une classe qui nécessite des arguments dans son constructeur, votre appel à "cls.newInstance()" apparaîtra.

Questions connexes