- 浏览: 211696 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (391)
- java (18)
- python (3)
- ruby (4)
- linux (48)
- 网络 (9)
- 前端 (2)
- 社会、文化、哲学、人生、百态 (0)
- 工具 (10)
- 下载 (0)
- 常用地址 (0)
- tracert (0)
- mysql (8)
- 开源相关收藏 (1)
- 模块查看依懒 (1)
- watch使用 (1)
- Tcpdump (2)
- easy_install安装 (1)
- 构造redis批量删除脚本 (1)
- MYSQL 性能测试 (1)
- JAVA code encode utf-8 (1)
- linux nginx awk 实时 每妙 (1)
- mkpasswd (1)
- spring security oauth (1)
- jmap dump java memory Analyzer (1)
- JAVA DUMP (1)
- swap linux 过高 解决 (1)
- SWAP (1)
- jmap jstat jstack dump (1)
- java jconsole 的使用 (1)
- git 常用 (1)
- MYSQL 索引 动态 唯一 (1)
- TCP 三次握手 四次挥手 (1)
- linux date (1)
- 删除 空行 注释行 (1)
- maven3 yum linux install repository (1)
- linux git 搭建 (1)
- linux sar eth1 查看 流量 (1)
- sar (1)
- netstat ip 过滤 常用脚本 (1)
- Tcpdump 包分析网络连接过程 (1)
- net ipv4 tcp time wait tw recycle (0)
- /etc/sysctl.conf linux 网络 配置 (1)
- ss 网络连接查看 (比netstat 快很多,实时性牺牲) (1)
- MYSQL 关键字 (1)
- Linux 下多核CPU知识 (1)
- top (1)
- 令牌 证书 (1)
- mysql unix timestamp (1)
- 端口扫描 nc nmap (1)
- 204 http code 状态码 (1)
- ss -s ss -l (1)
- linux 常用 curl (1)
- linux sed 替换 换行 (1)
- centos yum install rpm install (1)
- spring-mvc源码解读 (1)
- 使用iftop查看实时的网络流量 (0)
- linux 命令 expect (1)
- HTTP (1)
- openssl ddif 加密 (1)
- iptables 详解 (1)
- python 虚拟化 VirtualEnv virtualenvwrapper (1)
- nginx (2)
- more less 实用技巧 (1)
- linux nginx (2)
- linux curl https ssl 证书 ca (1)
- openssl (1)
- php mysql linux (1)
- linux 虚拟机 虚拟 xen (0)
- linux 虚拟机 虚拟 xen kvm (1)
- linux perl 单行执行技巧 (1)
- mysql 查看库占用空间 表查用空间 (1)
- linux tcpdump (1)
- maven (1)
- sun.misc.Unsafe (1)
- OpenSSL生成证书 (1)
- http://blog.csdn.net/zzulp/article/details/8018751 (1)
- maven 本地 jar dependency (1)
- 计算JAVA代码行数最简单命令 sed (1)
- 常用的证书格式转换 rsa eg (1)
- 加密 解密 签名 (1)
- 分析jar包冲突 (1)
- 使用JMockit编写java单元测试 (1)
- Linux 技巧:让进程在后台可靠运行的几种方法 (1)
- 环境变量控制 (1)
- 5+ 个 tar 命令的用法,附示例 (1)
- scp自动输入密码 (1)
- ps axo pid (1)
- ppid (1)
- comm (1)
- pmem (1)
- lstart|grep mysql (0)
- lstart (1)
- etime|grep mysql (1)
- UML类图字少好理解 (1)
- HTTP经典文章 (1)
- git (1)
- Git常用命令 (1)
- LINUX 系统被攻击的分析过程 (1)
- NIO (1)
- LINUX 操作快捷键使用 (1)
- openSSL命令、PKI、CA、SSL证书原理 (1)
- shell (2)
- 转载 (1)
- mysqldump 可以直接dump->xml (1)
- VIM比较全面的文章 (1)
- eclipse regex 正则表达式 (1)
- synchronized (1)
- 锁 (1)
- java 正则表达式 regex (1)
- Reference Queue 引用 源码 (1)
- spring aop 源码 分析 (1)
- java @Cache @Transaction 注解 (1)
- spring aop (1)
- spring jdk proxy cglib 动态代理 性能比较 (1)
- spring proxy private public 代理限制 (1)
- spring transaction aop 事务 (1)
- spring autowire 注解注入 (1)
- 桥接 NAT NAT地址转换 内部网络 虚拟网络 (1)
- spring-web-mvc 源码解读 之 RequestMappingHandlerMapping (1)
- find atime mtime ctime -n n +n (1)
- android studio 快捷键初探 (1)
- android 源码阅读的计划 (1)
- 计算机网络学习-VLAN (1)
- sed 高级 合并行 (1)
- CAP 一致性 可用性 分布式容错性 (1)
- android lib so 库文件 (0)
- android lib so 库文件 移植 (1)
- android 不错的博文 (1)
- sourceinsight 源码 阅读 (1)
- Android Tab UI (1)
- 诗 (1)
- mysql 批处理 (0)
- netty 堆外内存 DirectByteBuffer (1)
- netty 并发 百万 推送 (1)
- Linux操作系统中内存buffer和cache的区别 (1)
- maven intellij target bytecode version (1)
- linux sleep()的实现原理 (1)
- android (2)
- javadoc 代码注释规范 (1)
- spring 自动注入bean auto (1)
- Photoshop CS6常用快捷键 (1)
- 股票 数据 机器 分析 (1)
- 批处理 (1)
- mysql -e (1)
- char (1)
- Unicode (1)
- 编码 (1)
- utf8 (1)
- utf-8 (1)
- utf16 (1)
- utf-16 (1)
- IntelliJ IDEA (1)
- ide (1)
- idea (1)
- intellij (1)
- 文件 (1)
- 目录 (1)
- 源代码 (1)
- CountDownLatch (1)
- CyclicBarrier (1)
- Semaphore (1)
- spring (1)
- linux 查看不同进制文件 (1)
- WebMvcConfigurationSupport (1)
- sdkman工具的使用 (1)
- http header (1)
- LINUX系统优化 (1)
最新评论
-
gelongmei:
威武我大酒神
shell脚本不换行刷新数据
自定义classloader实现JAVA热替换
自定义classloader实现JAVA热替换
public class HotClassLoader extends ClassLoader {
public HotClassLoader() {
super(ClassLoader.getSystemClassLoader());
}
private File objFile;
public File getObjFile() {
return objFile;
}
public void setObjFile(File objFile) {
this.objFile = objFile;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
//这个classLoader的主要方法
System.out.println("findClassfindClassfindClassfindClass");
Class clazz = null;
try {
byte[] data = getClassFileBytes(getObjFile());
clazz = defineClass(name, data, 0, data.length);//这个方法非常重要
if (null == clazz) {//如果在这个类加载器中都不能找到这个类的话,就真的找不到了
}
} catch (Exception e) {
e.printStackTrace();
}
return clazz;
}
/**
* 把CLASS文件转成BYTE
*
* @throws Exception
*/
private byte[] getClassFileBytes(File file) throws Exception {
//采用NIO读取
FileInputStream fis = new FileInputStream(file);
FileChannel fileC = fis.getChannel();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableByteChannel outC = Channels.newChannel(baos);
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
while (true) {
int i = fileC.read(buffer);
if (i == 0 || i == -1) {
break;
}
buffer.flip();
outC.write(buffer);
buffer.clear();
}
fis.close();
return baos.toByteArray();
}
}
public class HotClassLoader extends ClassLoader {
public HotClassLoader() {
super(ClassLoader.getSystemClassLoader());
}
private File objFile;
public File getObjFile() {
return objFile;
}
public void setObjFile(File objFile) {
this.objFile = objFile;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
//这个classLoader的主要方法
System.out.println("findClassfindClassfindClassfindClass");
Class clazz = null;
try {
byte[] data = getClassFileBytes(getObjFile());
clazz = defineClass(name, data, 0, data.length);//这个方法非常重要
if (null == clazz) {//如果在这个类加载器中都不能找到这个类的话,就真的找不到了
}
} catch (Exception e) {
e.printStackTrace();
}
return clazz;
}
/**
* 把CLASS文件转成BYTE
*
* @throws Exception
*/
private byte[] getClassFileBytes(File file) throws Exception {
//采用NIO读取
FileInputStream fis = new FileInputStream(file);
FileChannel fileC = fis.getChannel();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableByteChannel outC = Channels.newChannel(baos);
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
while (true) {
int i = fileC.read(buffer);
if (i == 0 || i == -1) {
break;
}
buffer.flip();
outC.write(buffer);
buffer.clear();
}
fis.close();
return baos.toByteArray();
}
}
相关推荐
总之,Java类热替换是一种强大的开发和调试工具,通过自定义ClassLoader和巧妙利用JVM特性,我们可以极大地提升开发效率。这个压缩包中的源码可能就是展示如何实现这个功能的一个实例,你可以仔细研究这些代码,加深...
通过自定义的 ClassLoader,我们可以实现类的热替换,例如,在 Web 服务器中,我们可以使用自定义的 ClassLoader 来实现热替换,以提高 Web 服务器的性能。 在 ClassLoader 中,还有一个重要的方法是 ...
自定义`ClassLoader`的设计和实现是一个高级话题,需要深入理解Java的类加载机制。通过这种方式,可以有效地解决在反序列化过程中因`serialVersionUID`不一致导致的问题,同时减少潜在的副作用,提升程序的稳定性和...
3. 整合自定义ClassLoader:了解如何将自定义的ClassLoader集成到Java应用程序中,替换或扩展默认的加载行为。 4. 考虑Java 2版本的兼容性:学习如何修改你的ClassLoader以适应Java 2及以上版本的特性,比如支持...
虽然标准的Java虚拟机(JVM)并不直接支持类的动态加载和替换,但是通过自定义ClassLoader和特定的工具,可以实现热部署。 首先,Java类的加载是由ClassLoader负责的。Java中有三层类加载器:Bootstrap ClassLoader...
- 按需加载类,实现热部署。 热部署是指在不重启应用服务器的情况下,能够加载新的类或者替换掉旧的类。对于需要频繁更新的应用,热部署功能非常实用。热部署技术可以应用于Web应用服务器、插件系统等领域。 当...
- 自定义ClassLoader在插件系统、热部署、模块化系统等领域有广泛应用。 5. **类的生命周期** - 加载:通过ClassLoader找到对应的.class文件。 - 链接:验证、准备、解析三个步骤。 - 初始化:执行类的静态初始...
1. **热更新实现**:通过自定义ClassLoader,可以在不重启服务器的情况下,加载新的类文件替换旧的类文件。 2. **多租户隔离**:淘宝网存在大量的商户和服务,每个服务都可能有自己的类加载器,这样可以有效地隔离...
热更新通常依赖于类加载器(Classloader)的工作原理来实现,本篇文章将深入探讨如何利用Android的类加载器实现热更新的机制。 首先,我们需要理解什么是类加载器。在Java和Android中,类加载器是负责查找、加载和...
3. 动态加载:创建自己的类加载器,尝试动态加载新的类,实现代码的热替换。 4. 类隔离:通过自定义ClassLoader实现不同模块之间的类隔离,避免类冲突。 总的来说,深入理解ClassLoader的工作原理对于优化程序性能...
我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的...
为了实现热部署,需要使用自定义的ClassLoader替换系统的加载器,创建一个新的ClassLoader,再用它加载Class,得到的Class对象就是新的(因为不是同一个类加载器),再用该Class对象创建一个实例,从而实现动态更新...
在热部署场景下,可以通过替换ClassLoader来实现不重启JVM就能更新代码;另外,对于加密的类文件,可以编写特定的ClassLoader解密后再加载。 了解ClassLoader的工作机制对于深入理解Java应用程序的运行过程至关重要...
3. 自定义ClassLoader: 开发者可以继承java.lang.ClassLoader类,创建自己的类加载器,实现特定的类查找和加载逻辑。这常用于动态加载插件、实现模块化系统或加载加密的类文件。 4. 双重检查锁定与类加载: 在多...
例如,我们可以创建一个从数据库加载类的ClassLoader,或者实现热更新功能,允许在运行时替换已加载的类。自定义ClassLoader需要重写`loadClass()`方法,并根据需求实现类的查找和加载。 总的来说,深入理解...
- **热部署**:在开发环境中,可以实现快速替换和更新类,而无需重启应用程序。 - **模块化系统**:不同模块使用不同的类加载器,隔离不同模块间的类,避免冲突。 - **安全沙箱**:每个加载器都有自己的命名空间,...
1. **安全性**: 如果没有双亲委托机制,那么自定义的类加载器就可以轻易地替换掉核心类库中的类,这将带来极大的安全隐患。 2. **避免重复加载**: 由于每个类加载器都有一个缓存机制,因此在同一个类加载器环境下...
三、自定义ClassLoader 1. 继承ClassLoader:为了实现特定的加载策略,如从网络加载类、从加密数据加载类等,可以继承ClassLoader并重写`findClass()`方法。 2. URLClassLoader:Java提供了一个内置的...
1. **自定义ClassLoader**:Java允许我们创建自定义的ClassLoader,这通常用于实现动态加载类的需求。自定义ClassLoader需要重写`findClass()`或`loadClass()`方法。`loadClass()`方法是类加载的入口,它会调用`find...