Java学习笔记系列-反射

反射的本质

  1. Java在运行时可以得到或判断某个对象的类型信息
  2. RTTI有一条前提就是某个对象的类型信息在编译时必须已知。RTTI的实质就是编译器在遍历检查代码时偷偷将类型信息记录下来并存储,以在运行时可以得到当编写完某个.java文件,并编译以后,就会产生一个Class对象,由编译器偷偷的把这个class对象保存在编译后的.class文件中,当这个.class文件被加载到内存以后,随之会在内存中建立这个Class对象了。因此,得到class对象的前提是能得到类编译后的.class文件。且class对象的功能强大,方法众多:Class.getInterfaces()、Class.getSuperclass()、Class.getName()、Class.isInterface()等等,能用来得到不少信息
  3. RTTI与反射在最底层的思想上是很相似的,本质的区别在于:对RRTI,编译器在编译时打开和检查.class文件,而对反射来讲,.class文件在编译时是不可获取的,在运行时未知对象已经来了再去打开和检查.class文件
  4. 反射机制使得java可以建立一个在编译时彻底未知的对象。反射在Java中用来支持其余特性的,例如对象的序列化和JavaBean

Class对象

Class对象是进行反射操做的入口,因此首先必须得到Class对象。除了经过实例获取外,Class对象主要由如下几种方法得到:java

  • 经过类加载器加载class文件
Class<?> clazz = Thread.currentThread().getContextClassLoader().
        loadClass("com.takumiCX.reflect.ClassTest");
  • 经过静态方法Class.forName()获取,须要传入类的全限定名字符串做参数(在得到class对象的同时会引发类的初始化;若是指定参数initialize为false时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化)
Class<?> clazz = Class.forName("com.takumiCX.reflect.ClassTest");
  • 经过类.class得到类的Class对象
Class<ClassTest> clazz = ClassTest.class;

Spring IOC反射机制

  1. 找到并加装配置
  2. 解析配置文件中的bean元素,并识别id和class
  3. 经过反射(Class.forName().newInstance())建立这个bean的实例
  4. 将id做为key、实例做为value存放进Spring容器中
  5. getBean取出实例
相关文章
相关标签/搜索