了解反射的前提,首先必须了解一下是类加载机制
1.类加载机制
a.编译原代码(将java代码转换成.CLASS文件)
b.加载class文件(jvm读取并加载class文件到内存中)
c.链接(验证类的内部结构的正确性,把符号引用转换成实际引用)
符号引用:
就是一串字符串,比如java.long.object,我们只知道object引用,但是不知道这个对象的具体位置在哪里
实际引用:
一个具体真正的对象,存在在内存中
d.初始化(对类进行初始化值,加载静态代码块以及静态变量会初始化值,如果类有父类的话,会先初始化父类)
e.定位main方法的位置
f.执行main方法
2.什么是反射?
这里就不用官方的话来回答了,用简洁的话概括,动态的加载对象
3.什么时候要用到反射?
不方便修改某一个类,但是还是要用到类里面的变量和方法,比如这个类中的变量和方法是用privice修饰,那么正常调用的话是没法调用的
4.反射的实现方式
原理:
字节码文件加载到内存的时候,jvm会对这个字节码文件进行剖析,并且会创建一个class对象,将字节码信息全部加载到class对象中,那么我们呢就可以直接获取这个class对象,来用到这个对象里面的方法和属性变量了
5.创建对象的方式
直接new出来;
利用反射创建出来
6.反射的好处和坏处
好处是可以动态的获取类的信息,进一步实现需要的功能;比如mybatis的xml可以直接使用业务层的mapper,原理是利用了反射动态创捷接口和实现类
坏处是效率没有直接new的时候高,因为如果使用反射,查找到类的资源后,还需要根据类加载器去创建这个类