我们知道对于一个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. 减小delphi体积的方法

    1.关闭RTTI反射机制  自从Delphi2010中引入了新的RTTI反射机制后,编译出来的程序会变得很大,这是因为默认情况下 Delphi2010 给所有类都加上了反射机制.而我们的工程并不每每都 ...

  2. C#编程经验-enum and struct

    enum,store fixed values,use array replace,not use this data-structurestruct,store several variables, ...

  3. Android App启动速度优化

    解决在桌面上点击APP图标后经过一两秒后才显示页面,以及App启动后主界面显示过慢问题 一.应用的启动方式 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会首先会创建一个新的进程分配给该应用 ...

  4. 围绕Buganizer的产品流程

    做技术的一定知道缺陷跟踪系统(bug系统),更不用说做测试的了,不过普遍都认为这系统是用来记录bug的,其实在google内部,这套系统是产品/项目围绕的核心.Google Buganizer扩展了类 ...

  5. sitemesh使用

    参考文章: https://my.oschina.net/heroShane/blog/199177 http://blog.csdn.net/u013019926/article/details/1 ...

  6. 04-体验一下apache组织封装的BeanUtil工具包

    apache 自己为程序员们封装了一个专门用于处理的工具类,其功能有(数据类型会自动转成与JavaBean相关的) map转javabean javabean转map javabean对象复制 获取j ...

  7. 安卓打开远程调试(免root)

    首先用数据线连接adb,在pc端执行: adb tcpip 5555 然后就能拔掉数据线了. pc执行这个: adb connect 172.19.208.2 就能连接上

  8. PHP常用的转义函数

    1. addslashes addslashes对SQL语句中的特殊字符进行转义操作,包括(‘), (“), (), (NUL)四个字符,此函数在DBMS没有自己的转义函数时候使用,但是如果DBMS有 ...

  9. java多线程中最佳的实践方案是什么?

    java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ...

  10. django 分页和中间件

    分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views h ...