引用无法在编译时解析的变量。 (JAVA)
我创造,我用e.g创建运行时类引用的程序:引用无法在编译时解析的变量。 (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");
所有这些代码是在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)
和处理非静态成员,以及,你可以通过调用clazz.newInstance()
如下创建Adaddon
一个实例,
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));
}
这个效果更好,但我仍然得到“字段”无法解析为类型的错误。我需要为此导入一个库吗? – RenboBash
你应该利用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
是一个静态字段,否则你应该已经通过一个实例类阿巴顿。
这很好,但唯一的问题是get(null);它说它不能在数组类型字符串上调用get null。另外,getField函数返回一个对象类型,而不是一个字段类型,所以我必须将其更改为对象。 – RenboBash
我不确定我在理解你在说什么。我已经在你的课堂上测试过这段代码,它可以工作。你使用的是什么版本的Java? –
我想我的答案解决了问题,如果它不让我看看我能否解决它。你想做什么/了解更多? –
类你做这样需要'implement'一个普通的'界面'。查找这些关键词以及如何对其进行编码。 (另外,'classForName()'几乎肯定是错误的方法,只要定期上课,会更容易。) – markspace