2012-10-29 79 views
0

我需要傳遞一個類,以便我可以訪問其靜態變量。 實施例:android - 通過類作爲參數訪問靜態變量

Class FirstClass 
{ 
static int x = 1; 
} 
Class SecondClass 
{ 
static int x = 2; 
} 

我在另一個類中的方法(其將通過的Firstclass和二等均可使用),但它需要訪問靜態變量,這裏是與邏輯的僞代碼:

public static void process(Class anyClass){ 
    anyClass.x; 
} 

回答

0

如果您需要確定在運行時要訪問哪個類,並且您有幾個具有類似命名變量的類,那麼可以使用Class.forName()以字符串形式返回類的實例。

http://developer.android.com/reference/java/lang/Class.html#forName(java.lang.String, boolean, java.lang.ClassLoader)

public static void process(String className){ 
    classInstance = Class.forName(className); 
} 

您還需要知道類的類型(這樣就可以正確地申報或投Children子)。最簡單的方法是讓我們的所有「anyClass」類型從一個通用的超類繼承。

class AnyClassType1 extends AnyClass 
class AnyClassType2 extends AnyClass 

然後澆鑄或聲明ClassInstance的:

Field f = anyClass.getDeclaredField("x"); 
int xValue = f.getInt(null); 

經由反射訪問靜態字段可以通過使null爲:

AnyClass classInstance; 
0

可以使用反射訪問類的成員實例參數爲getInt()

我們使用getDeclaredField是因爲您想訪問非公開字段。不足之處在於,如果該字段對於您正在查看的課程不存在,則它會拋出InvalidFieldException,即使它在超類中定義了。但是,當然,如果它是在超類中定義的,它將擁有公共或受保護的訪問權限,並且getField也可以正常工作。

+0

這看起來不錯,不幸的是它拋出了一個NoSuchFieldException,儘管該靜態字段確實存在。 – lorraine

+0

對,對不起。由於'getField'只適用於可公開訪問的字段。您需要將字段設置爲public(或者protected,如果訪問者位於同一個類中),或者使用'getDeclaredField'代替。 – onon15