###反射
####个人理解
几个月前,第一次接触到反射,一脸懵逼,总想把反射这个词和看到的程序建立起来。一开始,想从反射的字面意思来理解这个词的意思,我想得是手头有把枪,对着一面墙开一枪,然后墙把子弹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这个实例化对象的属性做修改。这就是反射的一部分应用。下一篇,写点另外的,对于对象的方法的操作