package com.javase.reflect;
import java.lang.reflect.Field;
/**
* 通过反射机制,访问java对象的属性,给属性赋值,读取属性的值(重点:五颗星*****)
* 本例中使用反射机制编写代码,看起来比不使用反射机制编写代码较复杂,但是灵活性增强了,这也是值得的。
* (本代码需要经常看一看,多理解,将来学习架构的时候有利于理解)
*/
public class ReflectText08五颗星 {
public static void main(String[] args) {
try {
// 通过完整类名获取到该类(完整类名的获取见下图)
Class studentClass = Class.forName("com.javase.bean.Student");
// 实例化对象
/*
这里的obj就是Student类的实例化对象,newInstance()方法底层调用了Student类的无参数构造方法,为此必须保证在Student
类中提供了无参构造方法,如果此类中没有无参构造方法,那么该行代码在运行中就会报异常。
*/
Object obj = studentClass.newInstance();
// 获取no属性(根据属性的名称来获取Field)
Field noField = studentClass.getDeclaredField("no");
// 给对象obj(也就是Student对象)的no属性赋值
/**
* 虽然使用了反射机制,但是三要素还是缺一不可
* 要素1:对象obj
* 要素2:属性名no
* 要素3:属性值55555
*/
noField.set(obj,55555);
// 获取对象obj(也就是Student对象)的no属性的值
System.out.println(noField.get(obj));
// 私有的属性也可以访问,但是需要打破封装
Field nameField = studentClass.getDeclaredField("name");//获取name属性
nameField.setAccessible(true);//打破封装,这样操作以后就可以访问private修饰的私有属性
// 给name属性赋值
nameField.set(obj,"张三");
// 获取name属性
System.out.println(nameField.get(obj));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}

/*
程序运行结果:
55555
张三
*/






![[Linux]Linux编译器-gcc/g++](https://img-blog.csdnimg.cn/3c357f0f31a24e15a751951ce461f9db.png)











