本篇文章將分為兩部分:
1任岸、通過反射獲取字段
使用反射獲取字段:
1.找到字段所在類的字節(jié)碼
2.獲取字段<pre><code>
public Field[] getFields():獲取當前Class所表示類中所有的public
的字段,包括繼承的字段.
public Field getField(StringfieldName):獲取當前Class所表示類中該fieldName名字的public
字段,包括繼承的字段.
public Field[] getDeclaredFields():獲取當前Class所表示類中所有的字段,不包括繼承的字段.
public Field[] getDeclaredField(Stringname):獲取當前Class所表示類中該fieldName名字的字段,不包括繼承的字段.
</pre></code>
通過一個例子加深下印象,代碼簡單直接貼代碼:<pre><code>
class OO{
public int oo;
}
class PP extends OO{
public String name;
public int age;
private int sex;
}
public class FiledDemo {
public static void main(String[] args) throws Exception {
Class clazz = PP.class;
Field[] fs = clazz.getFields();//獲取類中public Filed包括父類
for (Field field : fs) {
System.out.println(field);
}
System.out.println("---------------------------");
fs = clazz.getDeclaredFields();//獲取類中所有的Filed不包括父類
for (Field field : fs) {
System.out.println(field);
}
System.out.println("---------------------------");
Field f = clazz.getField("name");//獲取指定的public Filed
System.out.println(f);
System.out.println("---------------------------");
f = clazz.getDeclaredField("sex");//獲取指定的Filed(包括private default public)不能獲取父類的
System.out.println(f);
}
}
</pre></code>
2含潘、通過反射使用字段
給某個類中的字段設置值和獲取值:
1,找到被操作字段所在類的字節(jié)碼
2,獲取到該被操作的字段對象
3,設置值/獲取值
Field類常用方法:
<pre><code>
void setXX(Object obj, XX value) :為基本類型字段設置值,XX表示基本數(shù)據(jù)類型
void set(Object obj, Object value):表示為引用類型字段設置值
參數(shù):
obj: 表示字段底層所屬對象,若該字段是static的,該值應該設為null
value: 表示將要設置的值
XX getXX(Object obj) :獲取基本類型字段的值,XX表示基本數(shù)據(jù)類型
Object get(Object obj) :表示獲取引用類型字段的值
參數(shù):
obj: 表示字段底層所屬對象,若該字段是static的,該值應該設為null
返回:
返回該字段的值.
</pre></code>
通過一個例子加深下印象脖镀,代碼簡單直接貼代碼:
<pre><code>class PP {
public String name = "ooxx";
public int age = 22;
private int sex = 1;
@Override
public String toString() {
return "name = " + name + " age = " + age + " sex = " + sex;
}
}
public class FiledDemo {
public static void main(String[] args) throws Exception {
getValue();
System.out.println("----------------------------");
setValue();
}
//通過反射獲取字段的值
private static void getValue() throws Exception {
Class clazz = PP.class;
Field f = clazz.getField("name");// 獲取指定的public Filed
Object obj = clazz.newInstance();
Object name = f.get(obj);//獲取name
System.out.println(name);
f = clazz.getField("age");
Object age = f.get(obj);
System.out.println(age);
f = clazz.getDeclaredField("sex");// 獲取指定的Filed(包括private default public)不能獲取父類的
f.setAccessible(true);
Object sex = f.get(obj);
System.out.println(sex);
}
//通過反射設置字段的值
private static void setValue() throws Exception {
Class clazz = PP.class;
Field f = clazz.getField("name");// 獲取指定的public Filed
Object obj = clazz.newInstance();
f.set(obj, "huang");
f = clazz.getField("age");
f.set(obj,33);
f = clazz.getDeclaredField("sex");// 獲取指定的Filed(包括private default
// public)不能獲取父類的
f.setAccessible(true);
f.set(obj, 2);
System.out.println(obj);
}
}</pre></code>