标签:stack dir 属性 sub trace get cli byte exce
我们知道,Java是一种动态语言。
那么怎样理解这个“动态”呢?
或者说一门语言具备了什么特性,才能称之为动态语言呢?
对于java,我是这样理解的。
我们都知道JVM(java虚拟机)执行的不是本地机器码指令,
而是执行一种称之为字节码的指令(存在于class文件中)。
这就要求虚拟机在真正执行字节码之前,先把相关的class文件加载到内存中。
虚拟机不是一次性加载所有需要的class文件,因为它在执行的时候根本不会知道以后会用到哪些class文件。
它是每用到一个类,就会在运行时“动态地”加载和这个类相关的class文件。
这就是java被称之为动态性语言的根本原因。
除了动态加载类之外,还会动态的初始化类,对类进行动态链接。
在JVM中负责对类进行加载的正是本文要介绍的类加载器(ClassLoader),所以,类加载器是JVM不可或缺的重要组件。
java中(指的是javase)有三种类加载器。
每个类加载器在创建的时候已经指定他们对应的目录, 也就是说每个类加载器去哪里加载类是确定的,我认为在ClassLoader类中应该会有getTargetPath()之类的方法, 得到他们对应的路径,找了找jdk的文档,发现是没有的。
以下是这三种类加载器和他们对应的路径:
* AppClassLoader -- 加载classpath指定的路径中的类
* ExtClassLoader -- 加载jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下的类
* BootStrap -- 加载JRE/lib/rt.jar中的类
那么类加载器是如何工作的呢?
可以参看jdk中ClassLoader类的源码。这个类的实现使用了模板方法模式,首先是loadClass方法来加载类,loadClass方法又调用了findClass方法,该方法读取并返回类文件的数据,findClass方法返回后,loadClass方法继续调用defineClass方法,将返回的数据加工成虚拟机运行时可识别的类型信息。
所以,我们如果开发自己的类加载器,只需要继承jdk中的ClassLoader类,并覆盖findClass方法就可以了,剩下的而工作,父类会完成。
其他java平台有的根据自己的需求,实现了自己特定的类加载器,
例如javaee平台中的tomcat服务器,Android平台中的dalvik虚拟机也定义了自己的类加载器。
虚拟机加载类有两种方式,一种方式就是上面提到的ClassLoader.loadClass()方法,
另一种是使用反射API,Class.forName()方法,其实Class.forName()方法内部也是使用的ClassLoader。
指定参数ClassLoader的话就用指定的;否则,返回的是调用者的类加载器。
Class类中forName方法的实现如下:
标签:stack dir 属性 sub trace get cli byte exce
原文地址:http://www.cnblogs.com/my376908915/p/6752390.html