java反射机制剖析(一)—简介

    由之前动态代理的学习再次接触到反射这个知识点,第二次接触了所以做了一些稍微深入的了解。那么,对于反射这部分的内容我打算分三篇博客来总结。本篇博客先对反射做一个大概的了解,包括反射有关的RTTI、定义的理解以及涉及到的其他知识的简介。

回顾

    java之前我接触反射这个知识,是在大话设计中的抽象工厂模式里,通过反射+配置文件来优化抽象工厂提高其应对需求变更的灵活性。当时对于反射的认知仅仅是它是一种技术,一种实例化对象的技术,一种实例化对象不依赖于写死的代码的技术。简单的说就是,它是一种可以摆脱用NEW去实例化对象,显然它应付与对象变换的能力是强大的。
    其实,反射不论在什么语言里都是一样的,只不过实现的手段不一样而已。之前对代理模式的深入学习过程中又遇到了反射,所以决定这次要一探究竟。

定义

    Java可以在运行时加载、探知、使用编译期间完全未知的class。再简单一点说就是java可以在运行时获得任一一个类的信息、构建类的Class对象(强调:不是该类的对象,是后面提高的类类型)、生成类实例、调用methods。这里类的信息包括它的基类、所实现的接口、方法等。
    个人觉得这里比较难理解的是“编译期间完全未知”。所以,特别解释一下。如下的代码。首先,这个Note类是不存在的,也就是说这段代码有错。分别执行两个方法就可以看出分别了,其实方法2编译时就无法通过,提示类是不能识别的类型,因为本来就不存在这个类。而方法1则时可以通过编译,执行时能打印“方法执行中”。但是实例化时会报空指针的错误。这两种不同时刻产生的错误就说明了“编译期间完全未知”这个说法。
public class Client {
     public static void main(String[] args) 
    		 throws InstantiationException, IllegalAccessException, ClassNotFoundException{	
                       System.out.println("方法执行中!"); //打印说明进入该方法
                       //方法1:通过反射实例化类Note	
		Class c=Class.forName("com.zjjReflect.Note");
	       Object o=c.newInstance();	
	       //方法2:直接实例化类Note
	       //Object o=new Note();
	     }
}

RTTI

     RTTI是Run-Time  Type Information 的缩写,意思是运行时类型信息。,RTTI提供了运行时确定对象类型的方法。但是,RTTI并不是一种技术,应该是一种概念。因为不同的语言对RTTI的实现形式是不一样的。简单的说就是在程序运行时去获得一个对象所对应的类的信息。这么说有点模糊,还是结合RTTI在某种语言里的实现来理解好一些。Java 中就是主要有:类型转换、类类型Class、instanceof体现了RTTI。

类类型java.lang.Class

    Class是所有类和接口的抽象,比如类的名字、类实现的接口、方法、属性等等。你可以通过某个对象的Class对象来获取类的信息。这里不做详细介绍,后面有单独的博客补充。

Class loader

    类加载的过程就是将.class加载到内存中。这里为什么要提到classloader呢?因为反射的过程使用到了Classloader,并且不同的类需要相对应的Classloader来加载。也就是说Classloader是和类是配对工作的,然后反射的特点却是在运行时才会知道类的信息
    所以我们也要对这部分的内容作个了解。也是为了能更好、更深刻的对反射理解。Java的Classloader有四种分别为:
         bootstrap classloader :引导(也称为原始)类加载器。                 
         extension classloader :扩展类加载器。
         Application ClassLoader:应用程序类加载器。
         User Defined ClassLoader:自定义类加载器。
    总结:在程序运行时通过类类型Class获得目标类的信息,然后在类信息的基础上使用相对应的类加载器加载到内存中,再然后对这个类中进行实例化,方法调用等的使用的整个过程。就是反射的详细的说法!!

你可能感兴趣的:(java)