Java程序员从笨鸟到菜鸟之(九十九)深入java虚拟机(八)开发自己的类加载器
欢迎阅读本专题的其他博客:
在大多数情况下,系统默认提供的类加载器实现已经可以满足需求。但是在某些情况下,您还是需要为应用开发出自己的类加载器。比如您的应用通过网络来传输 Java 类的字节代码,为了保证安全性,这些字节代码经过了加密处理。这个时候您就需要自己的类加载器来从某个网络地址上读取加密后的字节代码,接着进行解密和验证,最后定义出要在 Java 虚拟机中运行的类来。下面将通过两个具体的实例来说明类加载器的开发。
要创建自定义的类加载器只需要扩展java.lang.ClassLoader类就可以,然后覆盖它的findClass(String name)方法即可。该方法根据参数指定的类的名字,去找对应的class文件。然后返回class对应的对象。下面我们就根据我们自定义的类加载器的源码来具体详解一下这个自定义的步骤:
自定义的类加载器:
(PS:突然发现WPS自带的画图工具也挺好用,虽然有点难看,哈哈)
当执行这段代码的时候。首先让loader2去加载Sample类文件,当然我们在执行这段代码的前提时在各个默认加载器中已经有我们Sample的class文件。Loader2首先让父加载器是loader1去加载,然后loader1会让系统类加载器去加载,系统类加载器会让扩展类加载器加载,扩展类加载器会让根类加载器加载,由于系统类加载器,扩展类加载器,根类加载器的默认路径中都没有我们要的sample类,所以loader2的默认路径有sample这个类,也就是说loader2会去加载这个sample类。当执行test(loader3)的时候,由于loader3的默认父加载器是根类加载器,并且根类加载前默认路径没有对应的sample.class文件,所以,直接的loader3类加载器就去加载这个类。
最后要说明的一点是,自定义类加载不光只能从我们本地加载到class文件,我们也可以加载网络,即基本的场景是:Java 字节代码(.class)文件存放在服务器上,客户端通过网络的方式获取字节代码并执行。当有版本更新的时候,只需要替换掉服务器上保存的文件即可。通过类加载器可以比较简单的实现这种需求。其实他的实现和本地差不多,基本上就是geclassdata方法改变了一些。下面我们来具体看一下:
http://blog.51cto.com/contest2012/3545281