我们知道对于一个java文件,如Test.java,首先需要通过javac命令(javac Test.java)进行编译,生成class文件,再将class文件在jvm上进行加载运行,也就是java命令(java Test)。

但是对于以下应用场景:正在运行的java程序,即class文件已经在jvm中运行加载,如果原来的java程序有所改动,重新生成了class文件,但是又不希望kill掉原先的java程序,该怎么做呢?springloaded提供了一个思路。

我是在eclipse下实验的,先建立一个SpringloadedTest的工程,在工程下面创建一个Test的java文件,代码如下:

 import java.util.concurrent.TimeUnit;
public class Test { public static void main(String[] args) throws Exception{
Reload reload = new Reload(); while (true) {
reload.load();
TimeUnit.SECONDS.sleep(3);
}
} public static class Reload { public void load() {
System.out.println("load!");
}
}
}

然后,在项目上右键,Run As->Run Configurations->Arguments->VM arguments,配置如下的参数,也可以在后面加上-Dspringloaded=verbose用来显示详细的重新加载信息(推荐!)

springloaded-1.2.5.RELEASE.jar可以到官网进行下载:https://github.com/spring-projects/spring-loaded

为方便起见,我直接把springloaded-1.2.5.RELEASE.jar放在项目src目录下,你也可以放在电脑硬盘的任意位置,配置成相应的路径就行了。

运行结果如下:

一开始是load!程序一直在运行当中,在eclipse中更改代码,保存,不用停止程序,运行结果变成reload!

看起来非常简单!

但是还是有一些问题:

1.不利用eclipse,用传统的javac和java命令,行不行?答案是不行,为此我做了一个实验,我先创建了两个文件夹,分别是test和test_replace,test目录下的java文件中是load,test_replace目录下的java文件是reload,然后在test目录下,运行程序java -javaagent:springloaded-1.2.5.RELEASE.jar -noverify Test,输出的是load,再用test_replace目录下的class文件替换test中的class文件,结果还是load,并没有任何改变!

我怀疑是因为eclipse创建的是一个完整的项目,拥有完整的资源,它的class文件都在bin文件夹下,所以替换之后,项目会自动检测,然后替换jvm中的class。

2.还要说明的是,class文件时间上也有要求!即替换的class文件要比原先的class文件要晚!如果比原先的class文件早,那么即使替换了,运行结果也不会变化!

3.注意观察代码,定义了一个静态类Reload,然后main函数中调用,假设如果没有这个类,直接在main函数中进行输出,然后修改输出的内容,行不行?答案是不行,我试过,输出的结果没有变化。为什么?这个问题,我暂时也无法回答,大家有知道的,可以告诉我哈。后来我又试了一下,把输出的内容用一个单独的static函数,这种方式也是可行的。就比如,在main函数中调用这个printHello函数,然后再函数中进行改变,也可以重新加载。

所以要想动态替换,还需要按照项目的格式要求,在bin目录下进行操作,并且需要注意class的时间问题。

以上就是关于springloaded的使用介绍,该方法同样适用于jar,但是我还没有试过,后面有机会再试。

利用springloaded进行java class动态替换的更多相关文章

  1. 利用springloaded进行java jar&class的动态替换

    之前已经写过一篇关于class的动态替换博客,今天我们来介绍一下如何用springloaded进行jar&class的动态替换. 首先说一下实验过程,结合了目前我正在做的项目,这个项目是一个前 ...

  2. Java 程序动态替换 docx 模板中定制值的实现例子

    项目系统中打印功能,导出 word 文档功能是挺常用的,本文介绍自定文档模板,程序实现模板内容中值替代的功能. 模板文件 template.docx ​ 执行 main public static v ...

  3. 利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

  4. Java动态替换InetAddress中DNS的做法简单分析1

    在java.net包描述中, 简要说明了一些关键的接口. 其中负责networking identifiers的是Addresses. 这个类的具体实现类是InetAddress, 底层封装了Inet ...

  5. Java动态替换InetAddress中DNS的做法简单分析2

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  6. 透过现象看本质:Java类动态加载和热替换

    摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...

  7. 突破IP限制动态替换代理ip。

    须要导入的两个jar包 实现的javabean <span style="font-size:18px;">package com.jx.po; public clas ...

  8. [转载] java的动态代理机制详解

    转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代 ...

  9. Android--底部导航栏的动态替换方案

    1.通常来说,一般情况下,我们的app的BottomTab会有集中实现方式. 自定义view,然后自己写逻辑去实现互斥. 自由度最高,因为啥都是自己写的. 使用RadioGroup+RadioButt ...

随机推荐

  1. 理解java回调机制

    摘自:ImportNew 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类 ...

  2. Python 输出

    普通的输出 生活中的“输出”: 软件中的“输出”: python中变量的输出: print('hello world') 格式化输出 占位符% print('Hello,%s' % 'Python') ...

  3. 【python】脚本连续发送QQ邮件

    今天习得用python写一个连续发送QQ邮件的脚本,经过测试,成功给国内外的服务器发送邮件,包括QQ邮箱.163邮箱.google邮箱,香港科技大学的邮箱和爱丁堡大学的邮箱.一下逐步解答相关技巧. 首 ...

  4. 使用nrm工具高效地管理npm源

    在使用npm时,官方的源下载npm包会比较慢,国内我们基本使用淘宝的源,如果公司内部搭建了一套npm私有仓库,公司内部的源不可能把npm官方的npm包都同步,所以需要切换npm源.如果使用npm/cn ...

  5. 1、minimum-depth-of-binary-tree

    题目描述 Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the ...

  6. 源码编译、安装net-snmp的方法和遇到的问题

    本文参考地址:http://blog.163.com/qiushuhui1989@126/blog/static/270110892014119113421364/ 1. 源码下载 # wget ht ...

  7. I18nUtils

    import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.*; ...

  8. 机器学习简要笔记(五)——Logistic Regression(逻辑回归)

    1.Logistic回归的本质 逻辑回归是假设数据服从伯努利分布,通过极大似然函数的方法,运用梯度上升/下降法来求解参数,从而实现数据的二分类. 1.1.逻辑回归的基本假设 ①伯努利分布:以抛硬币为例 ...

  9. Linux网站运维工程师基础大纲

    第一阶段:Linux运维基础 第一章:Linux基础以及入门介绍 1.Linux硬件基础 2.Linux发展过程 3.创建虚拟机和系统安装 第二章:Linux系统目录结构介绍 1.Linux系统优化 ...

  10. Python中字符串/字典/json之间的转换

    import json #定义一个字典d1,字典是无序的 d1 = { "a": None, "b": False, "c": True, ...