Java中的反射机制
目录
一.概述
二.反射机制的实现原理
1.Class类(根基)
三中创建Class对象的方法:
1.已知类的字符串地址(框架自动映射参数的原理)
2.类名.class(Mybatis创建Class对象的原理)
3.对象名.class(将一个对象转json格式的原理)
三.模拟Mybatis查询后,自动数据封装
四.反射机制的优缺点
1.优点
2.缺点
一.概述
Java反射机制是运行状态中的,对任意一个类,都能知道这个类所有的属性和方法
核心原理:java.lang.Class类
一个Class对象表示一个正在运行时的类,我们可以通过Class类中提供的方法,拿到类中的所有的属性和方法(包括私有的),并创建类的对象,所以Class类时java反射机制的根基,一旦.class文件被加载到内存中,就会为其创建(有且仅有)一个Class对象,任何类被使用时都会创建一个Class对象
二.反射机制的实现原理
首先反射机制的实现离不开java提供的三个类:
1.Class类(根基)
Class类中提供了很多方法,可以让我们获取类中的属性和方法
三中创建Class对象的方法:
1.已知类的字符串地址(框架自动映射参数的原理)
String className = "包名.类名";
Class c = Class.forName(className);
2.类名.class(Mybatis创建Class对象的原理)
Class c = 类名.class;
3.对象名.class(将一个对象转json格式的原理)
Class c = 对象名.class;
class.forName(类地址)方法:通过类地址返回一个Class对象
newInstannce:创建对象,返回值Object类型
getFieldS():拿到所有的属性(不包括私有的),返回值是Field数组
getDeclaredFields():拿到所有的属性(包括私有的属性),返回值是Field数组
getMethods():拿到所有的方法(不包括私有的),返回值是Mehod数组
getDeclaredMethods():拿到所有的方法(包括私有的),返回值是Mehod数组
三.模拟Mybatis查询后,自动数据封装
这里详细介绍一下Mybatis自动映射以及Spring自动管理对象如何实现根据不同的类返回相应的对象,利用了泛型<T>实现,不指定返回值类型
- 返回值是 T,调用时写出目标类型,编译器就按该类型推断并检查
- “编译期根据参数推断 T 的具体类型”,并没有实际转换
public static <T> T putData(String className, Map<String,Object> map) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {//获得传入的类地址的CLass对象Class c = Class.forName(className);System.out.println(c.getTypeName());//创建一个传入类的对象T o = (T) c.newInstance();//动态获得类中的属性Field[] fileds = c.getDeclaredFields();//赋值for (Field field:fileds){//获得属性的名字String name = field.getName();//通过属性的名字找到对应的set方法名,将第一个字母转为大写String methodName = "set"+(char)(name.charAt(0)-32)+name.substring(1);//通过名字,获得方法对象Method setMethod = c.getMethod(methodName,field.getType());//从map取数据赋值setMethod.invoke(o,map.get(name));}return o;}
四.反射机制的优缺点
1.优点
通过反射机制可以动态调用任意类中的信息,对象中的方法,增加了程序的复用性和灵活性,例如框架,写一套可以处理任意类
2.缺点
使用反射机制效率低,可以对私有成员操作,打破了封装性,安全性低,在使用反射机制时,应该避免直接对私有成员操作