2017-10-07 6 views
0

Je crée un programme où je crée des références de classe au cours de l'exécution en utilisant par exemple:Référence une variable qui ne peut pas être résolue au moment de la compilation. (Java)

String hero1builder = "index."; 
System.out.println("Enter hero 1:"); 
hero1 = scanner.nextLine(); 
hero1builder += hero1; 
hero1cls = Class.forName(hero1builder); 
System.out.println("Hero 1 found"); 

Tout ce code est à l'intérieur d'un try/catch et fonctionne comme prévu. Mon défi vient quand je veux référencer les variables à l'intérieur de la référence de classe I. À la compilation, java remarque que la variable que je veux référencer ici ne peut pas encore être résolue et ne sera pas compilée. Comment puis-je contourner cela, afin que je puisse référencer les variables à l'intérieur de la classe?

String[] hero1list = hero1cls.counterList; 

J'ai essayé de nombreuses méthodes pour référencer la variable counterList, mais aucune n'a fonctionné. Il est important que hero1cls reste dynamique, sinon mon programme ne pourra pas fonctionner.

(Dans cet exemple, index est le package, donc index.Abaddon.counterList est ce que je veux référencer.Ceci fonctionne parfaitement si je l'écris explicitement comme ça.) (PS 2: Ce n'est pas un problème de . counterList champ est la seule chose qui jette une erreur dans ce programme et des méthodes telles que hero1cls.getField() travail)

Voici un exemple des classes je référencement.

package index; 

public class Abaddon { 
    public static String[] counterList = {"Axe", 
        "AncientApparition", 
        "Doom", 
        "Lina", 
        "Lion", 
        "OutworldDevourer", 
        "ShadowDemon", 
        "Slark", 
        "Undying" 
    }; 
} 
+0

classes que vous faites de cette façon besoin de 'implement' une «interface» commune. Recherchez ces mots clés et comment le coder. (Aussi, 'classForName()' est certainement la mauvaise approche.Faites juste une classe régulière, ça sera plus facile.) – markspace

Répondre

0

Si vous voulez vous débarrasser de get(null) et gérer membre non statique ainsi, vous pouvez créer une instance de Adaddon en appelant clazz.newInstance() comme suit,

String className = "index.Abaddon"; 
    Class<?> clazz = Class.forName(className); 
    Field field = clazz.getDeclaredField("counterList"); 
    if (field.getType().isArray()) { 
     final String[] arr = (String[]) field.get(clazz.newInstance()); 
     System.out.println(Arrays.toString(arr)); 
    } 
+0

Cela fonctionne mieux, mais j'obtiens toujours l'erreur que "Field" ne peut pas être résolu en un type. Ai-je besoin d'importer une bibliothèque pour cela? – RenboBash

0

Vous devrait exploiter la méthode de réflexion Java et dans ce cas particulier la méthode Class # getField. Voici le code:

String hero1builder = "index."; 
System.out.println("Enter hero 1:"); 
hero1 = scanner.nextLine(); 
hero1builder += hero1; 
hero1cls = Class.forName(hero1builder); 
System.out.println("Hero 1 found"); 
Field counterListField = hero1cls.getField("counterList"); 
String[] counterList = (String[])counterListField.get(null); 
System.out.println(Arrays.toString(counterList); 

Notez que le counterList.get(null) ne fonctionne que parce que counterList est un champ statique, sinon vous auriez dû passer une instance de la classe Abaddon.

+0

Cela fonctionne plutôt bien, mais le seul problème est get (null); Il dit qu'il ne peut invoquer get null sur la chaîne de type tableau. De plus, la fonction getField retourne un type d'objet, pas un type de champ, donc j'ai dû le changer en objet. – RenboBash

+0

Je ne suis pas sûr de comprendre ce que vous dites. J'ai testé ce code sur votre classe et cela fonctionne. Quelle version de Java utilisez-vous? –

+0

Je pense que ma réponse résout le problème, si elle ne laisse pas voir si je peux le réparer. Qu'avez-vous voulu faire/en savoir plus? –