反射_Field

来源:互联网 发布:深圳软件开发有限公司 编辑:程序博客网 时间:2024/06/16 12:08
/**
 *Field:利用Class对象获取字段的信息
 */
 //1.获取字段
 //1.1获取Field的数组
 public Field[] getDeclaredFields();


 Field[] fields = clazz.getDeclaredFields();  //clazz为字段所在的类的Class对象
 
 //1.2获取指定名字的Field
 public Field getDeclaredField(String name)  //name 为字段的名字


 Field field = clazz.getDeclaredField(fieldName); 
 //2.获取指定对象的指定字段的值(Field的方法 obj:字段所在的对象)
 public Object get(Object obj)


 Object val = field.get(obj); 
 //3.设置指定对象的指定字段的值 (obj:字段所在的对象,value:要设置的值)
 public void set(Object obj,Object value)
 field.set(obj,value);
 
 例:
 
package com.chj.field;


public class Person {
String name;
private Integer age;
}
 
@Test
public void testField() throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
//获取Class对象
String className="com.chj.field.Person";
Class clazz = Class.forName(className);

//获取字段   
Field[] fields = clazz.getDeclaredFields();
for(Field f : fields){
System.out.println(f);
}
Field field = clazz.getDeclaredField("name");
System.out.println(field);
//设置值
Person person = new Person();
field.set(person,"ABC");

Object val = field.get(person);
System.out.println(val);
//若字段是私有的,需要调用setAccessible(true)方法
Field field2 = clazz.getDeclaredField("age");
//设置值
field2.setAccessible(true);
field2.set(person,12);
//取值
Object val2 = field2.get(person);
System.out.println(val2);
}


输出:
java.lang.String com.chj.field.Person.name
private java.lang.Integer com.chj.field.Person.age
java.lang.String com.chj.field.Person.name
ABC
12



//工具方法
/**
* 为字段赋值
* @param obj
* @param field
* @param val
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
private void setFieldValue(Object obj, Field field, Object val) throws IllegalArgumentException, IllegalAccessException {
field.setAccessible(true);
field.set(obj, val);
}
/**
* 从Class对象或其父类中获取字段
* @param clazz
* @param fieldName
* @return
*/
public Field getField(Class clazz, String fieldName) {
for(Class clazz2 = clazz;clazz2 != Object.class;clazz2 = clazz2.getSuperclass()){
try {
Field field = clazz2.getDeclaredField(fieldName);
return field;
} catch (Exception e) {}
}
return null;
}

/**
* 为指定对象取出指定字段
* @param obj
* @param field
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public Object getFieldValue(Object obj, Field field) throws IllegalArgumentException, IllegalAccessException{
field.setAccessible(true);
return field.get(obj);
}

//类Student
package com.chj.field;
public class Student extends Person {}


@Test
public void testClassField() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
String className = "com.chj.field.Student";
String fieldName = "age";//可能为私有,可能在其父类中。
Object val = 20;

//创建className对应类的对象,并为其fieldName赋值为val
Object obj = null;

Class clazz = Class.forName(className);
//从指定对象或其父类中获取指定字段
Field field = getField(clazz,fieldName);
//为指定对象的指定字段赋值
obj = clazz.newInstance();
setFieldValue(obj,field,val);
//为指定对象取出指定字段
System.out.println(getFieldValue(obj,field));
}

输出:20