反射记录点滴——Field
反射记录点滴
1、 反射获取类的属性
- Class.getDeclareFileld(String name)
返回一个
Filed对象,该对象反映此Class对象所表示的类或接口的指定已声明字段。
- Class.getDeclaredFields()
返回
Field对象的一个数据,这些对象反应此Class对象所表示的类或接口所声明的所有字段。
- Class.getField(String name)
返回一个Field对象,它反应此Class对象所表示的类或接口公共成员字段。
- Class.getField()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字
举个栗子🌰:
import java.util.Date;
/**
*
* @author cc
* @date 2016/8/10 17:35
* @version 1.0
*/
public class Car {
private Long id;
private String name;
public String nname;
private Date createDate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNname() {
return nname;
}
public void setNname(String nname) {
this.nname = nname;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
import java.lang.reflect.Field;
import java.util.Date;
/**
*
* @author cc
* @date 2016/8/10 17:40
* @version 1.0
*/
public class ReflectFieldTest {
public static void main(String[] args) {
Car car = new Car();
car.setId(1L);
car.setName("BYD");
car.setCreateDate(new Date());
try{
Field property1=car.getClass().getDeclaredField("name");
System.out.println(property1);
Field property2 = car.getClass().getField("nname");
System.out.println(property2);
}catch(SecurityException e){
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
输出:
private java.lang.String main.Car.name
public java.lang.String main.Car.nname
2、 进行属性获取更改
获得这个Field之后就可以获取他的值或者设置它的值了。获取他的值用get类型方法,他针对常见类型提供了对应get方法。
举个栗子🌰
try{
Field property1=car.getClass().getDeclaredField("name");
// System.out.println(property1.get(car));//错误的方法,抛出异常
Field property2 = car.getClass().getField("nname");
System.out.println(property2.get(car));
}catch(SecurityException e){
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
错误使用会抛出异常
java.lang.IllegalAccessException: Class main.ReflectFieldTest can not access a member of class main.Car with modifiers "private"
正确使用输出正确结果
copyName
值得注意的是获取私有属性的时候必须先设置Accessible为true,然后才能获取。
Field property1=car.getClass().getDeclaredField("name");
property1.setAccessible(true);
System.out.println(property1.get(car));
正确使用输出正确结果
BYD
修改值
Field property2 = car.getClass().getField("nname");
System.out.println(property2.get(car));
property2.set(car,"AAA");
System.out.println(property2.get(car));
结果
copyName
AAA
不要让以后的自已,为曾经的不够努力而伤悲

浙公网安备 33010602011771号