- 浏览: 401000 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
handong1587:
代码有一处错.query函数最后一行return的应该是:re ...
RMQ -
yuandong0828:
简洁的特别透彻细致,多谢,
虚函数、虚指针和虚表 -
adam_zs:
谢谢分享!
括号匹配问题 -
hongloumengyanzxw:
good[b][/b]
dup和dup2函数 -
chriszeng87:
最后第二种情况右下角的那个点是不是可以看作相交点的?上面的那种 ...
判断两个链表是否相交
Java虚拟机中可以安装多个类加载器,系统默认主要有三个类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader。当然也可以自定义类加载器,自定义的加载器必须继承ClassLoader。
类加载器也是Java类,因为其它Java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这个就是BootStrap。BootStrap它是嵌套在Java虚拟机内核中的,jvm启动,这个类就会启动,它是由c++语言编写的。
Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类加载器对象时,需要为其指定一个父级类加载器对象或者默认采用系统类加载器为其父级类加载。
例如:
public class ClassLoaderTest { public static void main(String[] args) { ClassLoader loader = ClassLoaderTest.class.getClassLoader(); while (loader != null) { System.out.println(loader.getClass().getName()); loader = loader.getParent(); } System.out.println(loader); } }
将输出:
sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader null //null就代表是BootStrap类加载器,该加载器是顶级加载器,没有父类加载器
深入
在Java中每个类都是由某个类加载器的实体来载入的,因此在Class类的实体中,都会有字段记录载入它的类加载器的实体(当为null时,其实是指Bootstrap ClassLoader)。 在java类加载器中除了引导类加载器(既Bootstrap ClassLoader),所有的类加载器都有一个父类加载器(因为他们本身自己就是java类)。而类的加载机制是遵循一种委托模式:当类加载器有加载类的需求时,会先请求其Parent加载(依次递归),如果在其父加载器树中都没有成功加载该类,则由当前类加载器加载。
Java的类加载器分为以下几种:
(1) Bootstrap ClassLoader
Bootstrap ClassLoader用C++实现,一切的开始,是所有类加载器的最终父加载器。负责将一些关键的Java类,如java.lang.Object和其他一些运行时代码先加载进内存中。
(2) ExtClassLoader
ExtClassLoader用java实现,是Launcher.java的内部类,编译后的名字为:Launcher$ExtClassLoader.class 。此类由Bootstrap ClassLoader加载,但由于Bootstrap ClassLoader已经脱离了java体系(c++),所以Launcher$ExtClassLoader.class的Parent(父加载器)被设置为null;它用于装载Java运行环境扩展包(jre/lib/ext)中的类,而且一旦建立其加载的路径将不再改变。
(3) AppClassLoader
AppClassLoader用java实现,也是是Launcher.java的内部类,编译后的名字为:Launcher$AppClassLoader.class 。AppClassLoader是当Bootstrap ClassLoader加载完ExtClassLoader后,再被Bootstrap ClassLoader加载。所以ExtClassLoader和AppClassLoader都是被Bootstrap ClassLoader加载,但AppClassLoader的Parent被设置为ExtClassLoader。可见Parent和由哪个类加载器来加载不一定是对应的。
这个类装载器是我们经常使用的,可以调用ClassLoader.getSystemClassLoader() 来获得,如果程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类都会由它来装载。而它的查找区域就是我们常常说到的Classpath,一旦建立其加载路径也不再改变。
(4) ClassLoader
ClassLoader一般我们自定义的ClassLoader从ClassLoader类继承而来。比如:URLClassloader是ClassLoader的一个子类,而URLClassloader也是ExtClassLoader和AppClassLoader的父类(注意不是父加载器)。
类加载器之间的父子关系为:
BootStrap -> ExtClassLoader -> AppClassLoader(即通常所说的System ClassLoader)
它们的管辖范围依次是:
- BootStrap------>JRE/lib/rt.jar
- ExtClassLoader---------->JRE/lib/ext/*.jar
- AppClassLoader---------->CLASSPATH指定的所有jar或目录。
类加载器的委托机制
当Java虚拟机要加载一个类时,到底该派哪个类加载器去加载呢?
(1) 首先是当前线程的类加载器去加载线程中的第一个类。
(2) 如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。
(3) 还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛出ClassNotFoundException,不是再去找发起者类加载器的儿子。因为没有getChlid方法,即使有,那么当有多个儿子,找哪一个呢?
那么,能不能自己写个类叫java.lang.System?
一般情况下不能,因为类加载采用委托机制,这样可以保证parent类加载器优先,也就是总是使用parent类加载器能找到的类,这样总是使用java系统提供的System。因为每个类加载器加载类时,又先委托给其上级类加载器,java.lang.System在BootStrap中最先加载。但是我们可以写一个类加载器来加载我们自己写的java.lang.System类。
当需要编写自己的类加载器时
- 自定义的类加载器必须继承ClassLoader。
- 重写loadClass方法与findClass方法。loadClass中先调用父类的loadClass,然后调用findClass,通常情况下只覆盖findClass就可以。
- 重写defineClass方法。
注:自定义的类加载器通常用于解密自己写的已加密的class字节码,否则即使别人拥有该class文件也无法被系统的类加载器正常加载。
原文地址:http://hi.baidu.com/sonmeika/blog/item/c5600d34d695452b5bb5f50d.html
发表评论
-
stop() 和 suspend() 方法为何不推荐使用
2011-10-21 15:39 1756反对使用stop(),是因为它不安全。它会解除由线程获取 ... -
使用阻塞缓冲区的生产者消费者
2011-10-07 19:59 1204Repository 重点在于Rep ... -
生产者消费者问题
2011-10-07 19:47 1633生产者消费者问题 生产者消费者问题是研究多线程程序 ... -
Java中从方法中返回多个值
2011-09-28 21:42 6505有些时候,我们需要从一个方法中返回多个值。那么在Java中该怎 ... -
遍历List时删除元素
2011-09-14 13:23 2375一般调用删除方法都是集合的方法,例如: List ... -
closure和callback
2011-09-12 22:24 1398闭包(closure)是一个可调用的对象,它记录了一些信息 ... -
倒排索引的简单实现
2011-09-06 20:33 12752首先看一个例子: 假设有3篇文章,file1, ... -
Java是解释型还是编译型
2011-09-01 19:58 1152Java程序需要编译,但是没有直接编译成机器语言,而是编译成. ... -
Java Socket网络编程
2011-09-01 11:34 1479在网络编程中,最基本的操作就是在两台机器之间建立点对点通信,S ... -
使用Java调用C/C++
2011-08-31 23:36 8370我们知道Java是一种平台 ... -
super.getClass()陷阱
2011-08-31 15:25 1204先给出一个问题,下面程序的输出结果是多少? impor ... -
一些java的面试题
2011-08-31 11:46 13191、一个".java"源文件中是否可以包括 ... -
Java中的文件操作
2011-08-30 22:46 992使用Java实现一些文件操作。 import j ... -
JDK1.5中的线程池
2011-08-29 22:50 901在JDK1.5中,线程池类为 ... -
实现java线程池
2011-08-29 22:43 1272线程池的作用: 线程池作用就是限制系统中执行 ... -
java thread中的run()和start()
2011-08-29 21:28 1305当调用start()后,此线程就处于就绪状态,但并没有运行。之 ... -
嵌套类和内部类的区别
2011-08-28 21:39 18371. 内部类的对象隐含一个外部类的对象引用,可以直接引用 ... -
JVM垃圾回收机制
2011-08-28 21:12 5851. JVM的gc概述 gc即垃圾收集机制是指 ... -
new class[0]
2011-07-28 23:59 1565new Class[0]表示有零个元素的Class数组,即空数 ... -
在两台计算机上使用RMI进行远程方法调用
2011-06-20 22:05 2202RMI概述 远程方法调用就是本地对象能够调 ...
相关推荐
ClassLoader 三种类加载方式 Boostrap Extenxsion 以及Application ClassLoad分别适用的场景
java 类加密 使用类加载器解密加载类 反射执行main
看完一个Java加载原理教程后,写了这个自己的类加载器,作个笔记,以便以且使用
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
Java类加载器.pdf
java类加载器学习三、类加载器的委托模式
java 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loader
深入探讨 Java 类加载器.wps深入探讨 Java 类加载器.wps深入探讨 Java 类加载器.wps
自定义Java类加载器demo,自定义了一个classLoader,重写了loadClass 和findClass,注意 loadClass打破了双亲委派机制,所有的类都要在自定义的class文件中找到,而findClass遵循了双亲委派机制
自己根据一些文章总结的,不知道有没有漏洞,希望大家知道,谢谢
类加载器(class ...本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。
java类加载器学习二、自定义类加载器
Java类加载器的详解,说的很详细,很不错。有兴趣的朋友可以下下来看看。
类加载器(class ...本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。
Java类加载器可以直接从Maven存储库加载并运行类,能在运行时解决依赖关系
关于Java类加载器的探讨
Java类加载器机制与模型
/** * java类加载器 * 类加载器负责加载与连接,这个过程是在运行时进行的,这种机制为java提供极大的灵活性 * * 类的生命周期 * class文件
本学习讲义是关于java类加载和反射机制需要注意的要点学习,内容详细