首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

Java软件工程师从笨鸟到初学者之(九十九)深入java虚拟机(八)开发自己的类加载器

2012-11-09 
Java程序员从笨鸟到菜鸟之(九十九)深入java虚拟机(八)开发自己的类加载器欢迎阅读本专题的其他博客:深入ja

Java程序员从笨鸟到菜鸟之(九十九)深入java虚拟机(八)开发自己的类加载器

      

欢迎阅读本专题的其他博客:


                         深入java虚拟机(一)——java虚拟机底层结构详解                         深入java虚拟机(二)——类的生命周期(上)类的加载和连接                         深入java虚拟机(三)——类的生命周期(下)类的初始化                         深入java虚拟机(四)——java虚拟机的垃圾回收机制                         深入java虚拟机(五)——java本地接口JNI详解                         深入java虚拟机(六)——类加载的父亲委托机制                         深入java虚拟机(七)深入源码看java类加载器ClassLoader

              在大多数情况下,系统默认提供的类加载器实现已经可以满足需求。但是在某些情况下,您还是需要为应用开发出自己的类加载器。比如您的应用通过网络来传输 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

                                 

    5楼boy21zhou3天前 21:33
    学习了。。不错
    Re: csh6243661883天前 21:33
    回复boy21zhoun共同学习。。。
    4楼beijiguangyong3天前 18:14
    暂时告一段落?
    Re: csh6243661883天前 21:33
    回复beijiguangyongn由于虚拟机的在往底层的东西,我也搞不明白了。。。所以只能暂时停止了。。呵呵
    3楼mazhaojuan3天前 16:18
    不错。很清晰,很详细!
    Re: csh6243661883天前 18:02
    回复mazhaojuann谢谢。。
    2楼csh6243661883天前 15:56
    虚拟机内容暂时告一段落。。。
    1楼lmj8109603974天前 09:28
    继续哦。。
    Re: csh6243661883天前 11:00
    回复lmj810960397n继续。。。

热点排行