Java通过反射机制修改只读属性参数

有如下代码

public class javaReflect {
	
	private Integer num=20;
	public Integer getNum() {
		return num;
	}
}

给定一个javaReflect的对象roc,能否把这个对象的num值改成30或者其他的整数?

从代码上看,这个类只提供了一个get方法而没有set方法,且用private修饰num的属性。因此num在该类中是个只读类,无法直接修改num的值。

但是可以通过反射机制来达到修改num的目的。

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象。都能够调用它的任意一个方法和属性;这种动态获取对象信息以及动态对象的方法的功能称为java的映射机制,java反射机制允许程序在运行时加载探知使用编译期间完全未知的Class。即java可以加载一个运行时才得知名称的Class,获得其完整结构。

对于本例,在获得该类的Class实例后,就可以通过反射机制获取到num属性对应的Field对象,然后可通过这个对象来修改num的值。

代码实现如下

import java.lang.reflect.Field;

public class javaReflect {
	
	private Integer num=20;
	public Integer getNum() {
		return num;
	}

		public void main() {
			javaReflect jr=new javaReflect();
			Classcla=javaReflect.class;
			
			try {
				Field field=cla.getDeclaredField("num");
				field.setAccessible(true);
				field.set(cla, 30);
				
			} catch (NoSuchFieldException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}

}




你可能感兴趣的:(Java)