jvm的传唱-类加载
jvm的传唱-类加载
PS:承接上一篇文档,由于初次写文档记录类内容,对于博客园目前的文档编译不熟悉,第一篇文章写的太不好看了,这次换了个模式 ,看看能好看点不,便于阅读。
先通过代码看看类加载器的种类和效果
View Code
为什么要使用这种模式呢,这里简单说两句,1.保障同一个类型 尤其是底层库类的唯一性,防止非法篡改,在jvm中判断一个对象的类型是与类加载器有关的,不同的类加载器即便对于开发人员来说一样的对象代码,表示出来的类型也是不一样的,所以还是能区别出来。
如何实现自定义的类加载器呢,每次通过先委托父类加载器加载,当父类加载器无法加载时,再自己加载。其实 ClassLoader 类默认的 loadClass 方法已经帮我们写好了,我们无需去写。
有的小伙伴可能会疑问,为什么要自定义类加载器,平时开发好像没怎么用到,有啥用呢?我总结自己觉得可能用到的地方,有的地方写的第三方jar包需要给别人使用,为了保障代码相对安全不被轻易解读,可以通过自定义类加载器在加载时进行加密处理,这样相对来说吧 是能解决安全问题的。
开始编写自定义类加载器代码如下,大家可以参考借鉴
View Code
"C:\Program Files\Java\jdk1.8.0_66\bin\java.exe" -Dvisualvm.id=603520010088200 "-javaagent:D:\ProgramSoft\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=63737:D:\ProgramSoft\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_66\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_66\jre\lib\rt.jar;D:\IdeaProjects\leecode\out\production\leecode" com.bface.calculate.ClassLoaderLecode 系统类加载器sun.misc.Launcher$AppClassLoader@14dad5dc 扩展类加载器sun.misc.Launcher$ExtClassLoader@1b6d3586 启动类加载器null 自定义类的类加载器sun.misc.Launcher$AppClassLoader@14dad5dc 我是由com.bface.calculate.ClassLoaderLecode$ZdyClassLoader类加载器加载的