Java反射基础(一) — ClassLoader简介
2015-05-29 13:59
609 查看
人们都说:反射反射程序员的快乐!反射技术运用的很广泛,如果想要你的系统灵活具有生命力,一般情况下是离不开反射的。
最近在研究AOP和容器的时候,都用到了动态代理,再一次接触到了反射的概念。最早接触到反射的概念还是在两年前学习抽象工厂模式,只是那时候只知道通过反射+配置文件用户可以灵活的更换数据库,但至于为什么,什么原理不清楚。这次借着再次接触的概念,来学习一下反射机制的原理。
定义:反射是程序在运行期间,可以动态加载一个类,实例化一个对象,调用这个对象的方法和给属性赋值。也是就说通过能完全的获取到类的全部信息,并且能在运行期间对其进行操作。
我们原先要加载某个类时,都是需要new出一个对象,在内存堆里为这个对象分配出一块空间使用。通过反射技术,我们避免了new的过程,我们只需要在配置文件里写类名,就可以动态的读取类。其程序过程如下:
如上图所示,class文件首先会被classLoader将其load到内存Code segment中。在Code segment中存放的是一个个对象,然后找到main方法开始执行。在运行过程中会有更多的class被加载到内存。
ClassLoader 简介:
ClassLoader 用来加载Java类到内存或JVM虚拟机中。一般来说,.java文件在经过Java编译器之后被转换成.class文件。ClassLoader负责读取这个文件,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个Java类。通过此实例的newInstance()方法就可以创建出该类的一个对象。
ClassLoader分类:
Java的ClassLoader分为三层,分别是BootStrap Class Loader 、Extestion ClassLoader、Application ClassLoader。Bootstrap ClassLoader 负责加载核心的JavaClass,采用C++、C语言,返回值为Null;Extestion ClassLoader负责加载扩展的Java Class(例如存放\jre\lib\ext 目录下的类);Application
ClassLoader 负责加载应用程序自身的类。其中bootstrap classloader是ExtensionClassLoader 的parent,Extension ClassLoader是App ClassLoader的parent。但这并不是继承的关系,而是相互引用。 在Extension ClassLoader 对象里有一个引用,指向bootstrap classloader。App ClassLoader 同理,使用get.parent()方法能获取到引用的对象。
ClassLoader 的加载机制:
当一个程序运行的时候,JVM启动,率先运行bootstrap classloader ,该类在加载java核心API的同时,会把ext classloader 和 app classloader同时加载进来,然后调用ext classloader加载扩展类。最后由App classloader 加载classpath 目录下定义的class,这是反射的基本加载流程,反射的加载方式还有一个最大的特点,那就是采用双亲委托模式进行类加载。
比如说我们自己自定义了一个ClassLoader。 首先会通过getParent()方法,找到上一层的ClassLoader,然后看上一层的classloader是否加载了,如果加载了就不会再加载一遍,只有当父 ClassLoader无法加载,才会由自己加载。这样的好处是什么呢?
可以避免重复加载,百事孝为先,有什么事先问父亲,如果父亲加载一遍了,就没必要再加载一遍
保证安全,例如,我们自己写了一个String.class来代替java核心API中定义的类型,每次启动时,String.class被Bootstrap classloader 加载,我们自己写的String.class永远没有机会执行。
以上只是针对这两天接触到ClassLoader做一个简单的介绍,反射机制还有很多东西需要深入研究,比如说其内部具体是怎么实现的,这可能就得去研究它的源码了。
最近在研究AOP和容器的时候,都用到了动态代理,再一次接触到了反射的概念。最早接触到反射的概念还是在两年前学习抽象工厂模式,只是那时候只知道通过反射+配置文件用户可以灵活的更换数据库,但至于为什么,什么原理不清楚。这次借着再次接触的概念,来学习一下反射机制的原理。
定义:反射是程序在运行期间,可以动态加载一个类,实例化一个对象,调用这个对象的方法和给属性赋值。也是就说通过能完全的获取到类的全部信息,并且能在运行期间对其进行操作。
我们原先要加载某个类时,都是需要new出一个对象,在内存堆里为这个对象分配出一块空间使用。通过反射技术,我们避免了new的过程,我们只需要在配置文件里写类名,就可以动态的读取类。其程序过程如下:
如上图所示,class文件首先会被classLoader将其load到内存Code segment中。在Code segment中存放的是一个个对象,然后找到main方法开始执行。在运行过程中会有更多的class被加载到内存。
ClassLoader 简介:
ClassLoader 用来加载Java类到内存或JVM虚拟机中。一般来说,.java文件在经过Java编译器之后被转换成.class文件。ClassLoader负责读取这个文件,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个Java类。通过此实例的newInstance()方法就可以创建出该类的一个对象。
ClassLoader分类:
Java的ClassLoader分为三层,分别是BootStrap Class Loader 、Extestion ClassLoader、Application ClassLoader。Bootstrap ClassLoader 负责加载核心的JavaClass,采用C++、C语言,返回值为Null;Extestion ClassLoader负责加载扩展的Java Class(例如存放\jre\lib\ext 目录下的类);Application
ClassLoader 负责加载应用程序自身的类。其中bootstrap classloader是ExtensionClassLoader 的parent,Extension ClassLoader是App ClassLoader的parent。但这并不是继承的关系,而是相互引用。 在Extension ClassLoader 对象里有一个引用,指向bootstrap classloader。App ClassLoader 同理,使用get.parent()方法能获取到引用的对象。
ClassLoader 的加载机制:
当一个程序运行的时候,JVM启动,率先运行bootstrap classloader ,该类在加载java核心API的同时,会把ext classloader 和 app classloader同时加载进来,然后调用ext classloader加载扩展类。最后由App classloader 加载classpath 目录下定义的class,这是反射的基本加载流程,反射的加载方式还有一个最大的特点,那就是采用双亲委托模式进行类加载。
比如说我们自己自定义了一个ClassLoader。 首先会通过getParent()方法,找到上一层的ClassLoader,然后看上一层的classloader是否加载了,如果加载了就不会再加载一遍,只有当父 ClassLoader无法加载,才会由自己加载。这样的好处是什么呢?
可以避免重复加载,百事孝为先,有什么事先问父亲,如果父亲加载一遍了,就没必要再加载一遍
保证安全,例如,我们自己写了一个String.class来代替java核心API中定义的类型,每次启动时,String.class被Bootstrap classloader 加载,我们自己写的String.class永远没有机会执行。
以上只是针对这两天接触到ClassLoader做一个简单的介绍,反射机制还有很多东西需要深入研究,比如说其内部具体是怎么实现的,这可能就得去研究它的源码了。
相关文章推荐
- eclipse调试Cts 单项
- Java目录
- 【项目管理和构建】十分钟教程,eclipse配置maven + 创建maven项目(三)
- 【项目管理和构建】十分钟教程,eclipse配置maven + 创建maven项目(三)
- JAVA自定义注解(Target,Retention,Documented,Inherit)
- Java基础-代码执行顺序(重要)
- java复习(四)
- java 调用webservice的方法
- JAVA动态代理初解
- kafka消息demo的java实现
- java基础整理の自动装箱雨拆箱(包装类)
- 基于javacv的数字图像处理
- java基础整理のstatic关键字
- Spring 访问各种数据库的配置
- Java Excel 导入导出
- SpringMVC之入门基础注解和参数传递
- java垃圾回收gc算法
- MyEclipse下的Debug调试
- Java项目设置session超时(失效)的三种方式
- java值传递思考