作者: Jakob Jenkov 譯者:葉文海(yewenhai@gamil.com)
使用 Java 反射機(jī)制你可以運(yùn)行期檢查一個(gè)類(lèi)的變量信息(成員變量)或者獲取或者設(shè)置變量的值。通過(guò)使用 java.lang.reflect.Field 類(lèi)就可以實(shí)現(xiàn)上述功能。在本節(jié)會(huì)帶你深入了解 Field 對(duì)象的信息。
可以通過(guò) Class 對(duì)象獲取 Field 對(duì)象,如下例:
Class aClass = ...//獲取Class對(duì)象
Field[] methods = aClass.getFields();
返回的 Field 對(duì)象數(shù)組包含了指定類(lèi)中聲明為公有的(public)的所有變量集合。 如果你知道你要訪(fǎng)問(wèn)的變量名稱(chēng),你可以通過(guò)如下的方式獲取指定的變量:
Class aClass = MyObject.class
Field field = aClass.getField("someField");
上面的例子返回的Field類(lèi)的實(shí)例對(duì)應(yīng)的就是在 MyObject 類(lèi)中聲明的名為 someField 的成員變量,就是這樣:
public class MyObject{
public String someField = null;
}
在調(diào)用 getField()方法時(shí),如果根據(jù)給定的方法參數(shù)沒(méi)有找到對(duì)應(yīng)的變量,那么就會(huì)拋出 NoSuchFieldException。
一旦你獲取了 Field 實(shí)例,你可以通過(guò)調(diào)用 Field.getName()方法獲取他的變量名稱(chēng),如下例:
Field field = ... //獲取Field對(duì)象
String fieldName = field.getName();
你可以通過(guò)調(diào)用 Field.getType()方法來(lái)獲取一個(gè)變量的類(lèi)型(如 String, int 等等)
Field field = aClass.getField("someField");
Object fieldType = field.getType();
一旦你獲得了一個(gè) Field 的引用,你就可以通過(guò)調(diào)用 Field.get()或 Field.set()方法,獲取或者設(shè)置變量的值,如下例:
Class aClass = MyObject.class
Field field = aClass.getField("someField");
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);
field.set(objetInstance, value);
傳入 Field.get()/Field.set()方法的參數(shù) objetInstance 應(yīng)該是擁有指定變量的類(lèi)的實(shí)例。在上述的例子中傳入的參數(shù)是 MyObjec t類(lèi)的實(shí)例,是因?yàn)?someField 是 MyObject 類(lèi)的實(shí)例。 如果變量是靜態(tài)變量的話(huà)(public static)那么在調(diào)用 Field.get()/Field.set()方法的時(shí)候傳入 null 做為參數(shù)而不用傳遞擁有該變量的類(lèi)的實(shí)例。(譯者注:你如果傳入擁有該變量的類(lèi)的實(shí)例也可以得到相同的結(jié)果)
本文鏈接地址: Java Reflection(四):變量