初步认识类加载器


 

类加载器:BootStrap,ExtClassLoader,AppClassLoader。

BootStrap是虚拟机自带的,不是java类来的,用于加载jre/lib/rt.jar,比如system.class文件。

ExtClassLoader是用于加载jre/lib/ext文件里面的class文件。

AppClassLoader一般是用于加载classpath环境变量里面的class文件。

类加载器是运用一种叫做委托机制的方式来加载class文件的。层层往上委托,最上层找不到下层委托的类,就把这个任务返回给下层自己干,最后要是都找不到,则会返回给最初委托的那个类加载器自己找,就算它找不到了,也不会再往下传递了。

 

 

那玩意搞了三个多小时,只是写了些和视频差不多的代码,稍微给class文件加密,然后在自己的类加载器上解密。同时也发现了视频有个被忽略的问题。

       首先总结一下为什么弄了这么久,最主要的原因是路径问题上搞得久,视频上用的是绝对或者相对路径的,我想弄个完整路径,就是根据计算类在哪里然后再通过配一下字符串放在自己想放的目录下。因为忘记了Class类还有个getName的方法,所以果断杯具。用了getClass().getResource().getFile();来得到文件名,够悲剧的!!!所以在思路上一直与路径纠结。之前写的加密和一个类加载器的时间还没有半个小时。测试的时候因为源文件还在,即使你用加密了的class文件替代bin目录下的那个,过一会儿Elipse会自动编译,覆盖你辛辛苦苦加密出来的那个。所以要把源文件移走,我加密的是Person类,所以把Person.java移到别处,再把加密了的class文件扔bin里面和其他class文件呆一起后,才可以用自己的类加载器加载进来。代码果断不展示了,路径问题那部分太丑陋了= =思路以及要注意的地方都说了,再说说视频上的不足之处吧。

       因为是直接用自己的类加载器加载进来的,所以只会得到一份字节码。要用newInstance也可以,但返回的是个Object对象,你想强制转Person?没门,你一写Person这个字符,就得用虚拟机的类加载器加载你的那个class文件,所以视频上继承了一个Date类,但是就算强制转换可以,得到的都是Date类的方法罢了,而自己那个子类独有的方法却不能使用。那么用接口可以吗?我觉得要是用接口的话,最好先把类写好,再把上面的方法写在接口上,在类后面加个implements即可,用继承也行,但用接口比较好。

       最后想,要是得到那个字节码,直接通过反射调用其方法也可以,不过似乎更累人。。。。。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值