我正在创建一个程序,我在运行时使用例如:
创建类引用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"
};
}
答案 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()