2015-12-24 51 views
-1

我想獲得字段爲初始化的值。 例如:獲得一個字段的值

class ClassA { 
    public String someString = "Merry Christmas"; 
} 

class ClassB { 
String anotherString = ClassA.class.getField("someString"); 
} 

有沒有辦法做到這一點?

+2

'新ClassA的()。someString' –

+0

這僅僅是一個例子。我正在創建一個帶有註釋的設置系統,所以我只能在我的settingsManager中使用該字段 – MyNameIsHans

回答

1

如果ClassA.stringstatic,這將是可能的。在這種情況下,你就可以通過反射來獲取值,而不需要獲得一個實例ClassA的保持其內部被定義someString

class ClassA { 
    public static String someString = "Merry Christmas"; 
} 
... 
Object s = ClassA.class.getField("someString").get(null); 

Demo 1.

如果變量是而不是靜態,並且您只是想獲得其初始值,但仍可以這樣做,假設ClassA具有默認構造函數:

public static void demo(Class<?> cl) throws Exception { 
    Object s = cl.getField("someString").get(cl.newInstance()); 
    System.out.println(s); 
} 

Demo 2.

+0

我現在將ClassString所在的Class作爲Class 給ClassB。我怎樣才能從那個類創建一個新對象? – MyNameIsHans

+0

@MyNameIsHans如果你有一個類型爲'Class '的變量'cl',你可以做'cl.getField(「someString」)。get(null)'。 – dasblinkenlight

+0

是的。但我希望'someString'保持非靜態,這就是爲什麼我必須創建一個'cl'的新對象。 (我需要'someString'初始化的值) – MyNameIsHans

1

你首先要創建一個實例ØClassAClassB

ClassA a = new ClassA(); System.out.println(a.someString);

但根據您的代碼的當前格式時,最好的辦法是宣佈someString靜:public static String someString = "Merry Christmas";。然後,你可以直接從任何其他類中的任何包的訪問此字段(因爲它是公共的):
System.out.println(ClassA.someString);

0

我覺得你不完全瞭解什麼是(非static)字段表示:這意味着該領域擁有特定值對於每個實例(對象)ClassA,因此您無法訪問字段內容,因爲可能會有成千上萬個不同的值。

有幾種選擇:

一個可能的解決方案是讓現場static

ClassA { 
    public static String someString = "Merry Christmas"; 
} 

ClassB { 
    String anotherString = ClassA.someString; 
} 

或者像@toubou說,你可以構造一個對象,並訪問特定對象的字段。但請注意,該字段代表對象的狀態,因此可以修改。

+0

請問dv'er請解釋這個答案有什麼問題? –

相關問題