基于Instrumentation的JAVA代码热替换

理类用来获取 Instrumentation 实例

package com.codeconch.util;
import java.lang.instrument.Instrumentation;

public class Monitor {
    private static Instrumentation instrumentation;
    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }
    public static Instrumentation getInstrumentation(){
    	return instrumentation;
    }
}

将这个类打成AgentJAR包monitor.jar

配置MANIFEST.MF

Manifest-Version: 1.0

Premain-Class: com.codeconch.util.Monitor

Can-Redefine-Classes: true

/**
 *
 * @author 赵聪慧
 * 2014-3-31下午5:21:12
 */
public class Test {

<span style="white-space:pre">	</span>static int i=5;
<span style="white-space:pre">	</span>private int a=2;
<span style="white-space:pre">	</span>public int geta(){
<span style="white-space:pre">		</span>return a+i;
<span style="white-space:pre">	</span>}
}

将Test类编译好放到另一个目录 这里放到了d:

将Test类中的代码改为

/**
 *
 * @author 赵聪慧
 * 2014-3-31下午5:21:12
 */
public class Test {
<span style="white-space:pre">	</span>static int i=5;
<span style="white-space:pre">	</span>private int a=2;
<span style="white-space:pre">	</span>public int geta(){
<span style="white-space:pre">		</span>return a*i;
<span style="white-space:pre">	</span>}
}

加agent参数 运行launch

-javaagent:D:\monitor.jar

public static void main(String args[]) throws InvalidProtocolBufferException{
		Test test=new Test();
		while(true){
			try {
				System.out.println(test.geta());
				byte[] bytesFromFile = FileUtil.getBytesFromFile("D:/Test.class");
				Monitor.getInstrumentation().redefineClasses(new ClassDefinition(Test.class,bytesFromFile));
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (UnmodifiableClassException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

输出

10
7
7
7
...

基于Instrumentation的JAVA代码热替换,布布扣,bubuko.com

时间: 2024-10-13 11:56:26

基于Instrumentation的JAVA代码热替换的相关文章

JAVA代码热部署,在线不停服动态更新

本地debug的时候,可以实时编译并更新代码,线上也可以不停服来动态更新类,即所说的java热部署. JDK代理的两种方式: 1.premain方式是Java SE5开始就提供的代理方式,但其必须在命令行指定代理jar,并且代理类必须在main方法前启动,它要求开发者在应用启动前就必须确认代理的处理逻辑和参数内容等等 2.agentmain方式是JavaSE6开始提供,它可以在应用程序的VM启动后再动态添加代理的方式 agentmain应用场景: 比如正常的生产环境下,一般不会开启代理功能,但是

Java实现热替换

package test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; public class Dynami

Java 类的热替换---转载

构建基于 Java 的在线升级系统 Java ClassLoader 技术剖析 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于和构建在线升级系统相关的基础概念.关于 ClassLoader 的详细细节许多资料可以参考,有兴趣的读者可以自行研读. 要构建在线升级系统,一个重要的技术就是能够实现 Java 类的热替换 —— 也就是在不停止正在运行的系统的情况下进行类(对象)的升级替换.而 Java 的 ClassLoader 正是实现这项技术的基础. 在

(转)Java 类的热替换 —— 概念、设计与实现

构建基于 Java 的在线升级系统 对于许多关键性业务或者庞大的 Java 系统来说,如果必须暂停系统服务才能进行系统升级,既会大大影响到系统的可用性,同时也增加了系统的管理和维护成本.因此,如果能够方便地在不停止系统业务的情况下进行系统升级,则可以很好地解决上述问题.在本文中,我们将基于实例,对构建在线升级 Java 系统的基础技术和设计原则进行了深入的讲解.相信读者能够根据文中的技术构建出自己的在线升级系统来. Java ClassLoader 技术剖析 在本文中,我们将不对 Java Cl

Java 类的热替换 —— 概念、设计与实现

别人的一篇技术博客,直接摘抄过来,免得再查看找不到了(本人在看的过程中可能会对原文格式或文字有修改) 原文地址:http://blog.163.com/web_promise/blog/static/109631655201222804931240/ 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于与构建在线升级系统相关的基础概念.关于 ClassLoader 的详细细节有许多资料可以参考,有兴趣的读者可以自行研读. 要构建在线升级系统,一个重要的技术

Java_类的热替换

转自:http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/#ibm-pcon Java ClassLoader 技术剖析 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于和构建在线升级系统相关的基础概念.关于 ClassLoader 的详细细节许多资料可以参考,有兴趣的读者可以自行研读. 要构建在线升级系统,一个重要的技术就是能够实现 Java 类的热替换 —— 也就是在不停止正在运行的系

替换文件中某个字符串并写入新内容(Java代码实现)

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStream; import java.io.InputStreamReader; /* * 替换文件(如果该文件含有子目录,则包括子目录所有文件)中某个字符串并写入新内容(J

基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源.视图和消息器>两篇博文的介绍,我们已经配置好了Spring所需的基本配置.在这边博文中,我们将介绍怎么使用这些配置到实际项目中,并将web.xml文件替换为一个Java类. 我们使用Java代码来配置Spring,目的就是使我们的这些配置能够复用,对于这些配置的复用,我们采用继承和引入来实现

【安卓】数据库基于脚本的&quot;增量更新&quot;,每次更新时不需修改java代码、!

思路: 1.当然是基于SQLiteOpenHelper.onCreate(第一次安装程序时调用).onUpdate(升级程序时调用) 2.用"脚本"(脚本制作具体方法问度娘)做数据库升级,文件名标识对应版本,java中根据"上一版本.当前版本"选择执行的脚本. 升级时,修改DB_VERSION(当前版本)即可. DBManager.java: package com.example.test; import java.io.ByteArrayOutputStream