2010-09-24 6 views
1

Je suis débutant au langage de programmation Java.Réflexion en Java?

Mon problème est: Je souhaite lire sys.input pour un nom de classe à partir de la console. En lisant le nom de la classe, je veux générer cette classe automatiquement et appeler sa méthode si cette classe existe déjà. mon procès est ici. Bien que je ne reçois aucune erreur, rien ne se passe. mes amitiés.


class s1{ 
    public s1(){ 
     System.out.println(""+ s1.class); 
    } 
} 
public class reflection { 

    public static void main(String[] args) throws IOException, ClassNotFoundException{ 

     System.out.println("enter the class name : ");  
     BufferedReader reader= new BufferedReader(new InputStreamReader(System.in)); 
     String line = "reflection_N3."; 
     line+=reader.readLine(); 

     //System.out.println(line); 

    // "name" is the class name to load 
     Class clas = Class.forName(line);  
     clas.getClassLoader();  
    } 
} 
+0

Vous ne faites rien avec la classe que vous chargez. Qu'auriez-vous prévu? –

Répondre

8

Vous ne créez pas une instance de la classe. Essayez

Class clas = Class.forName(line); 
Object obj = clas.newInstance(); 

Cependant, le problème est, vous ne pouvez pas faire grand chose avec cet objet, sauf si vous connaissez le type exact, et le jeta à ce type.

Dans cet exemple, vous pouvez essayer de le convertir en type de classe, par ex.

if (obj instanceof s1) { 
    s1 myS1 = (s1) obj; 
    myS1.s1(); 
} 

Cependant, cela fonctionne difficilement dans la vie réelle, où vous ne connaissez pas les types possibles à l'avance. La solution typique à ceci est de définir une interface pour un but spécifique, et exige que la classe implémente cette interface. Vous pouvez ensuite rediriger l'instance de classe vers cette interface (en lançant une exception si la distribution échoue), et appeler ses méthodes d'interface, sans avoir besoin de connaître son type concret. Ou, comme l'a noté @helios, vous pouvez utiliser la réflexion pour obtenir une méthode de la classe chargée ayant un nom spécifique. Btw la convention Java est de commencer les noms de classe avec des majuscules, d'où S1 et Reflection.

+2

Ou en utilisant la réflexion pour obtenir la méthode, aussi 'class.getMethod (...);' et invoquez-le 'method.invoke (obj, ...);' – helios

+0

Merci pour votre solution.alors, je serai plus attention à nommer les classes. – scratmiller

2

Vous obtenez uniquement le ClassLoader, vous ne construisez jamais réellement un objet de la classe spécifiée.

Utilisez clas.newInstance() si vous souhaitez appeler le constructeur par défaut ou recherchez Class.getConstructor(...) si vous avez besoin d'appeler un constructeur spécifique.

+0

Merci pour vos conseils. – scratmiller

Questions connexes