反射记录点滴——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
posted @ 2016-08-10 18:18  Mr-cc  阅读(189)  评论(0)    收藏  举报