反射的概念
反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的所有成员:构造方法(Constructor),成员方法(Method),成员变量(Field)
使用反射的前提:
获得要操作类的字节码文件对象,也就是.class文件。
使用场景:
反射技术主要是用于通用型技术,在各大框架底层广泛使用
反射的核心思想和关键就是:得到编译后的class文件对象
获取类对象:
获得类对象的三种方式:
- 类名.class
- 对象名.getClass
3.Class.forName(“全限定类名”)
Class类下的方法:
String getSimpleName(); 获得类名字符串:类名
String getName(); 获得全限定类名:包名+类名
获取构造器:
获取某个构造器:Constructor 类对象.getDeclaredConstructor(构造器的参数列表);
获取全部构造器:Constructor[] 类对象.getDeclaredConstructors();
Constructor:
- T newInstance(Object… initargs)
创建对象,注入构造器需要的数据。 - void setAccessible(true)
修改访问权限,true代表暴力攻破权限,false表示保留不可访问权限(暴力反射)
获取成员变量:
获取某个成员变量:Field 类对象.getDeclaredField(“变量名”)
获取全部成员变量: Field 类对象.getDeclareFields()
Field的方法:给成员变量赋值和取值
void set(Object obj, Object value):给对象注入某个成员变量数据
Object get(Object obj):获取对象的成员变量的值。
void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属性。
Class getType(); 获取属性的类型,返回Class对象。
String getName(); 获取属性的名称。
获取方法:
获取某个方法:Method 类对象.getDeclareMethod();
获取全部方法:Method 类对象.getDeclareMethods();
Method的方法:
Object invoke(Object obj, Object… args)
参数一:触发的是哪个对象的方法执行。
参数二: args:调用方法时传递的实际参数
入门案例:
实体类略
/**
*测试类
*/
public class ReflectDemo01 {
public static void main(String[] args) throws Exception {
// (int id, String name, int age, char sex, String address, String tel)
Student s1 =
new Student(1,"五六七",26,'男'
,"小鸡岛","12445781");
Hibernate.save(s1);
// Pig(String name, double weight, String color, String onwer, String sex)
Pig peiQi = new Pig("佩奇",500.0 , "粉色","小红","小公猪");
Hibernate.save(peiQi);
}
}
public class Hibernate {
// 提供一个方法:可以保存一切对象数据的字段和具体值
public static void save(Object obj) throws Exception {
PrintStream ps = new PrintStream(new FileOutputStream(Contant.DEST_FILE+"data.txt",true));
Class<?> c = obj.getClass();
Field[] fields = c.getDeclaredFields();
ps.println("================="+c.getSimpleName()+"=====================");
for (Field field : fields) {
field.setAccessible(true);
String value = field.get(obj) +"";
ps.println(field.getName()+"="+ value);
}
}
}