JVM自定义类加载器
时间:2022-07-22
本文章向大家介绍JVM自定义类加载器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
默认类加载器: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
类中的注释发现该代码
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
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
}
}
- [Golang软件推荐] Frp内网穿透
- [Golang软件推荐] Golang通用连接池
- RxJS -- Subscription
- ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
- RxJS速成 (下)
- RxJS速成 (上)
- Typescript 查缺补漏
- Git -- Stash
- Git -- Rebase
- Git -- 分支与合并 (命令行+可视化工具p4merge) Fast Forward 合并禁用 Fast Forward 合并自动合并解决合并的冲突
- 使用Angular CLI进行单元测试和E2E测试
- Git - 使用命令和P4Merge进行diff
- 使用Angular CLI进行Build (构建) 和 Serve
- 使用Angular CLI生成路由
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- linux 网络编程 socket选项的实现
- Ubuntu16.04安装Jenkins的方法图文详解
- leetcode树之对称二叉树
- linux 上在指定时间段内每隔多少分钟自动执行任务计划crontab
- 详解如何使用Spark和Scala分析Apache访问日志
- Centos 7.4中的远程访问控制的实现方法
- Linux查找特定程序whereis实例详解
- SpringBoot实战(二):SpringMvc接收xml请求
- CentOS环境下安装PHPUnit的方法分析
- Centos下安装Ansible的示例代码
- ubuntu18.04安装搜狗拼音的简易教程
- linux中$符号的基础用法总结
- Linux下的 mariadb 使用 root 用户启动方式(推荐)
- window与linux项目部署之linux文件路径不存在问题
- Ubuntu 18.04安装 pyenv、pyenv-virtualenv、virtualenv、Numpy、SciPy、Pillow、Matplotlib