java-反射(1)-通过反射改变对象的属性

###反射
####个人理解
几个月前,第一次接触到反射,一脸懵逼,总想把反射这个词和看到的程序建立起来。一开始,想从反射的字面意思来理解这个词的意思,我想得是手头有把枪,对着一面墙开一枪,然后墙把子弹biu的一下就反弹回来。但是在代码里面,没看到biu的一下反弹的操作,然后就看不懂代码。心塞塞。。。突然,前段时间开窍了。跳出了以前的思路。
现在,我就把反射理解为另外一种操作对象的各种属性和方法的方式。当然,反射还有很多更高级的用法。简单来讲,通过Class对象来操作对应的对象的各种属性和方法的这种方式,就叫反射。
####反射在对象的成员变量中的应用
#####实体类:Dog
以下是实体类Dog的代码


/**
 * 超可爱的狗狗
 * 
 * @author cc
 *
 */
public class Dog {

	/// 全是私有化的属性
	private String name;
	private int sex;
	private int weight;
	private String type;

	public Dog(String name, int sex, int weight, String type) {
		this.name = name;
		this.sex = sex;
		this.weight = weight;
		this.type = type;
	}

	/// 只提供了get方法
	public String getName() {
		return name;
	}

	public int getSex() {
		return sex;
	}

	public int getWeight() {
		return weight;
	}

	public String getType() {
		return type;
	}
}

#####初始化Dog,并且用反射的方式去修改它的属性
直接上代码:

/**
 * 反射测试
 * 
 * @author cc
 *
 */
public class ReflectTest {

	public static void main(String[] args)
	        throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		// 性别: 0:母, 1:公
		Dog dog = new Dog("点点", 0, 25, "哈士奇");
		String name = dog.getName();
		System.out.println("狗狗的名字是:" + name);
		// 由于Dog的成员变量都是私有的,并且当前Dog类没有提供set方法。
		// 在创建了对象之后,不能够改变Dog对象的属性。
		// 如果想改变对象的属性,则需要用点不常规的办法来做这件事情,即:反射
		// 我个人的理解,反射就是一种能够拿到某个类的所有公有、私有属性和方法的一种手段。
		// 接下来,看看如何改变Dog的名字、性别等属性
		Class<? extends Dog> clazz = dog.getClass();// 获取到对象对应的class对象
		Field[] fields = clazz.getDeclaredFields();//
		for (Field f : fields) {
			String fileName = f.getName();
			int m = f.getModifiers();
			String mStr = Modifier.toString(m);
			System.out.println(fileName + " 属性:" + mStr);
		}

		// 把上面已经创建好的狗狗的名字改为:大大
		Field nameField = clazz.getDeclaredField("name");// 获取私有成员变量:name
		nameField.setAccessible(true);// 设置操作权限为true
		nameField.set(dog, "大大");
		System.out.println("通过反射机制,最后修改的狗狗的名字是:" + dog.getName());

		Field typeField = clazz.getDeclaredField("type");
		typeField.setAccessible(true);
		typeField.set(dog, "金毛");

		System.out.println("狗狗的品种变为了:" + dog.getType());
	}

}

上面的代码已经很明确了,就是Dog的属性是私有的,并且Dog对象没有提供set方法来给私有的属性修改值。那么就通过Dog的实例化对。
来获取对应的Class对象,再通过Class对象来获取属性的Field对象,再通过Field对象来给dog这个实例化对象的属性做修改。这就是反射的一部分应用。下一篇,写点另外的,对于对象的方法的操作

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java反射是指在程序运行的时候,通过特定的API来检查或修改程序的状态、能力和内部属性等,而这些在正常情况下是无法通过编译时检查来完成的。例如,通过反射机制,我们可以获取一个对象的类型信息并调用其方法、访问它的属性,以及创建一个新对象等。 反射获取对象属性值,首先需要通过Class类的forName()方法来获取对象的Class实例。然后通过Class类的getDeclaredField()方法获取对象属性的Field对象,再通过Field对象的get()方法来获取属性的值。如果需要获取私有属性值,则需要通过setAccessible(true)方法来取消Java语言的访问检查机制,以允许获取私有属性的值。 例如,假设有一个Person类,其中包含有一个private String name属性,现在需要获取该属性的值,可以使用反射机制进行如下操作: ``` Class<?> clazz = Person.class; Object obj = clazz.newInstance(); Field field = clazz.getDeclaredField("name"); field.setAccessible(true); String nameValue = (String) field.get(obj); ``` 通过以上代码,我们可以获取Person对象的name属性值,并将其赋值给nameValue变量中。 需要注意的是,反射机制虽然功能强大,但由于它会在运行时改变程序的状态和能力,因此会带来诸多安全性和性能上的问题,尤其是容易引起类型转换异常和内存泄漏等问题,因此在使用反射机制时要谨慎操作,避免不必要的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值