2017-10-07 66 views
0

我創造,我用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

回答

0

如果你想擺脫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

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是一個靜態字段,否則你應該已經通過一個實例類阿巴頓。

+0

這很好,但唯一的問題是get(null);它說它不能在數組類型字符串上調用get null。另外,getField函數返回一個對象類型,而不是一個字段類型,所以我必須將其更改爲對象。 – RenboBash

+0

我不確定我在理解你在說什麼。我已經在你的課堂上測試過這段代碼,它可以工作。你使用的是什麼版本的Java? –

+0

我想我的答案解決了問題,如果它不讓我看看我能否解決它。你想做什麼/瞭解更多? –