引用在编译时无法解析的变量。 (Java)的

时间:2017-10-07 14:26:56

标签: java class dynamic compiler-errors

我正在创建一个程序,我在运行时使用例如:

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

所有这些代码都在try / catch中,并按预期工作。 当我想引用我引用的类中的变量时,我的挑战就来了。

在编译时,java注意到我想在这里引用的变量尚未得到解决而且它不会编译。我怎么能绕过这个,所以我可以引用类里面的变量?

String[] hero1list = hero1cls.counterList;

我尝试了很多方法来引用变量counterList,但没有一种方法有效。 hero1cls保持动态非常重要,否则我的程序无法正常运行。

(在这个例子中,index是包,所以index.Abaddon.counterList是我想要引用的。如果我这样明确地写它,这非常有效。)(PS 2:这不是范围问题。counterList是唯一一个在这个程序中抛出错误的东西,而且诸如hero1cls.getField()之类的方法可以工作。)

以下是我引用的类的示例:

package index;

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

2 个答案:

答案 0 :(得分:0)

您应该利用Java反射方法,在这种特殊情况下使用Class#getField方法。 这是代码:

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

请注意,counterList.get(null)仅适用于counterList是静态字段,否则您应该已经传递了Abaddon类的实例。

答案 1 :(得分:0)

如果您想摆脱fread并处理非静态成员,可以通过调用get(null)创建Adaddon的实例,如下所示,

clazz.newInstance()