Java反射基础(一) — 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无法加载,才会由自己加载。这样的好处是什么呢?

  1.  可以避免重复加载,百事孝为先,有什么事先问父亲,如果父亲加载一遍了,就没必要再加载一遍
  2. 保证安全,例如,我们自己写了一个String.class来代替java核心API中定义的类型,每次启动时,String.class被Bootstrap classloader 加载,我们自己写的String.class永远没有机会执行。

以上只是针对这两天接触到ClassLoader做一个简单的介绍,反射机制还有很多东西需要深入研究,比如说其内部具体是怎么实现的,这可能就得去研究它的源码了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值