前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM自定义类加载器

JVM自定义类加载器

作者头像
lpe234
发布2020-07-27 17:28:10
3540
发布2020-07-27 17:28:10
举报
文章被收录于专栏:若是烟花若是烟花

默认类加载器:Bootstrap ClassLoader --> Extension ClassLoader --> Application ClassLoader

  • Bootstrap ClassLoader:顶层类加载器,负责加载Java基础类,主要是 {JRE_HOME}/lib 下面的 rt.jar,resources.jar,charset.jar和class等。
  • Extension ClassLoader:第二层加载器,负责加载Java扩展类,主要是 {JRE_HOME}/lib/ext 下面的jar和class
  • Application ClassLoader:负责加载当前Java应用的classpath中的所有类

其中Bootstrap ClassLoader是JVM级别的,由C++编写。Extension ClassLoader、Application ClassLoader都是Java类。

Bootstrap ClassLoader由JVM启动,然后初始化sun.misc.Launcher,Launcher初始化Extension ClassLoader、Application ClassLoader。

由于一些特殊的需求:如①加密:Java代码很容易被反编译,如果想对自己的代码进行加密。可先将编译后的代码进行加密,然后再由自定义ClassLoader先解密,然后再加载类。②从非标准来源加载类:可以在自定义ClassLoader中,从指定的来源加载类。

自定义ClassLoader

自定义ClassLoader需要继承java.lang.ClassLoader抽象类,重写findClass方法,在findClass方法中调用defindClass。

ClassLoader创建时,如果没有指定parent,默认为Application ClassLoader

示例

官方示例

可以在java.lang.ClassLoader类中的注释发现该代码

代码语言:javascript
复制
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
代码语言:javascript
复制
class NetworkClassLoader extends ClassLoader {
    String host;
    int port;
    
    public Class findClass(String name) {
        byte[] b = loadClassData(name);
        return defineClass(name, b, 0, b.length);
    }
    
    private byte[] loadClassData(String data) {
        // load the class data from the connection
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自定义ClassLoader
  • 示例
    • 官方示例
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档