我正在创建一个程序,其中可以在运行时使用以下方式创建类引用:
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"
};
}
最佳答案
如果您想摆脱get(null)
并处理非静态成员,则可以通过按以下方式调用Adaddon
来创建clazz.newInstance()
实例:
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));
}
关于java - 引用一个在编译时无法解析的变量。 (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46621307/