引用无法在编译时解析的变量。 (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" 
    }; 
} 
+0

类你做这样需要'implement'一个普通的'界面'。查找这些关键词以及如何对其进行编码。 (另外,'classForName()'几乎肯定是错误的方法,只要定期上课,会更容易。) – markspace

如果你想摆脱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)); 
    } 
+0

这个效果更好,但我仍然得到“字段”无法解析为类型的错误。我需要为此导入一个库吗? – 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是一个静态字段,否则你应该已经通过一个实例类阿巴顿。

+0

这很好,但唯一的问题是get(null);它说它不能在数组类型字符串上调用get null。另外,getField函数返回一个对象类型,而不是一个字段类型,所以我必须将其更改为对象。 – RenboBash

+0

我不确定我在理解你在说什么。我已经在你的课堂上测试过这段代码,它可以工作。你使用的是什么版本的Java? –

+0

我想我的答案解决了问题,如果它不让我看看我能否解决它。你想做什么/了解更多? –