JAVA bootstrap ClassLoader和JAVA核心API替换

来源:互联网 发布:绍兴网络电视台 回放 编辑:程序博客网 时间:2024/06/05 23:04

JAVA bootstrap ClassLoader和JAVA核心API替换

1 双亲委派模型

  JAVA虚拟机规范定义了两种类型的类装载器-启动类装载器和用户自定义类装载器,启动类装载器是JAVA虚拟机实现的一部分,通过继承ClassLoader类,用户可以创建自定义的类装载器来完成特定要求的加载。JAVA虚拟机已经创建了2个自定义类装载器-扩展类装载器和系统类装载器。
  每一个用户自定义的类装载器在创建时被分配一个“双亲”parent类装载器。如果没有显示地传递一个双亲类装载器给用户自定义的类装载器的构造方法,系统类装载器就默认被指定为双亲。如果传递到构造方法的是一个已有的用户自定义类装载器的引用,该用户自定义类装载器就作为双亲;如果向构造方法传递了 null,启动类装载器就是双亲。
  在此模型下,启动类装载器可以抢在扩展类装载器之前去装载类,而扩展类装载器可以抢在系统类装载器之前去装载那个类,系统类装载器又可以抢在网络类装载器之前去装载它。这样,使用双亲-孩子委派链的方式,启动类装载器会在最可信的类库-核心JAVA API-中首先检查每个被装载的类型,然后,才依次到扩展路径、系统类路径中检查被装载的类型文件。用这种方法,类装载器的体系结构就可以防止不可靠的代码用它们自己的版本来替代可以信任的类。

2 替换JAVA核心API

  默认情况下,bootstrap启动类装载器装载jre/lib目录下的核心类。通过在命令行下使用参数-Xbootclasspath,可以让bootstrap启动类装载器装载的我们自己的类,我们也可以修改JAVA核心类API,然后让启动类装载器优先装载修改的API类,就可以替换原来的API。

  我们拷贝java.lang.Integer类的源代码,做如下修改:

[java] view plaincopy
  1. public Integer(int value) {  
  2.   System.out.println( "Customer Integer Initialized" );  
  3.   this.value = value;  
  4. }  

然后在下面的MyIntegerTest.java中调用java.lang.Integer类:

[java] view plaincopy
  1. public class MyIntegerTest  
  2. {  
  3.   public static void main( String[] args )  
  4.   {  
  5.     System.out.println( new Integer( 100 ) );  
  6.   }  
  7. }  

  编译新的java.lang.Integer类之后,用jar命令生成myinteger.jar文件,然后在命令行上运行下面命令:

java -Xbootclasspath/p:myinteger.jar MyIntegerTest

  输出如下:

  Customer Integer Initialized
  100

由此可见,修改后的java.lang.Integer类替换了JRE的java.lang.Integer类。

0 0
原创粉丝点击