java类的动态载入模型(一)

[b]概念[/b]

java应用程序是依赖虚拟机JVM的(可以说它是一种伪代码)。java类文件经过编译生成字节码文件,这种字节码文件可以被JVM识别并解释。但是JVM如何获得它呢,这需要一种寻找方案,java提供了ClassLoader类来实现这个机制。JVM通过ClassLoader来寻找指定的类并载入它们。

在实际运行中,java类是动态载入的,需要的时候才载入JVM。

java类的动态载入是一种委托模型,见下图。
[img]http://www.iteye.com/topics/download/b585603c-497c-46ee-8a9c-f1c60dc0ecf3[/img]
共有四种ClassLoader类型:
[list]bootstrap loader :固化在JVM中,这个东西不是用java写的。载入基本的java类,如jre/lib/rt.jar
ExtClassLoader :载入扩展类
AppClassLoader :载入本地自定义类
URLClassLoader :载入来自网络的类文件[/list]

当一个类需要由指定的ClassLoader载入的时候,该ClassLoader先将这个载入任务交给它的parent(这里不是继承的概念),就这样一层一层把任务传递上去,直到找到可以执行载入的ClassLoader。
做个试验
[code]package com.classloader.test;
import com.log.test.LoggingExampleImp;

public class CTTest
{

/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Class sc = java.util.Date.class;
System.out.println(sc.getName());
System.out.println(sc.getClassLoader());

Class st = LoggingExampleImp.class;
System.out.println(st.getName());
System.out.println(st.getClassLoader());

}

}[/code]
输出:
java.util.Date
null
com.log.test.LoggingExampleImp
sun.misc.Launcher$AppClassLoader@82ba41

String和自定义的LoggingExampleImp分别被自己的ClassLoader载入。假设有一个自定义的java.util.Date(记住这是自定义的),如果不用委托机制会有什么效果呢。java.util.Date就可能被AppClassLoader载入,这样jre中的Date就会被覆盖,呵呵,如果自定义个System String呢...。这种委托机制阻止了恶意代码对应用程序的污染,是java应用程序的第一层安全机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值