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.已知类的字符串地址(框架自动映射参数的原理)
java 复制代码
String className = "包名.类名";
Class c = Class.forName(className);
2.类名.class(Mybatis创建Class对象的原理)
java 复制代码
Class c = 类名.class;
3.对象名.class(将一个对象转json格式的原理)
java 复制代码
Class c = 对象名.class;

class.forName(类地址)方法:通过类地址返回一个Class对象

newInstannce:创建对象,返回值Object类型

getFieldS():拿到所有的属性(不包括私有的),返回值是Field数组

getDeclaredFields():拿到所有的属性(包括私有的属性),返回值是Field数组

getMethods():拿到所有的方法(不包括私有的),返回值是Mehod数组

getDeclaredMethods():拿到所有的方法(包括私有的),返回值是Mehod数组

三.模拟Mybatis查询后,自动数据封装

这里详细介绍一下Mybatis自动映射以及Spring自动管理对象如何实现根据不同的类返回相应的对象,利用了泛型<T>实现,不指定返回值类型

  • 返回值是 T,调用时写出目标类型,编译器就按该类型推断并检查
  • "编译期根据参数推断 T 的具体类型",并没有实际转换
java 复制代码
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.缺点

使用反射机制效率低,可以对私有成员操作,打破了封装性,安全性低,在使用反射机制时,应该避免直接对私有成员操作