动态更新jar

qq_20880617 2015-12-28 02:27:54
我希望远程加载新的jar,不希望重新启动服务,一些信息已经序列化在文件里,问题是,如果我更新了jar,再反序列化后,是否可以得到最新的类信息
...全文
228 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
q123501p 2015-12-30
  • 打赏
  • 举报
回复
假设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现? 在java中,我们的类都是通过ClassLoader来加载的,同时ClassLoader具有层级关系,当某个类找不到时,它会去他的父类加载器去寻找,如果依然找不到,就抛出ClassNotFoundException了。 为了动态加载hello.jar里面的Util类,我们需要将这个jar包放入到我们的类加载器中去,然后再获取里面的类。如下面的代码。 // 位于hello.jar package com.flyingzl; public class Util { public static void getVersion(){ System.out.println("java version: " + System.getProperty("java.version")); } } import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; public class Main { public static void main(String[] args) { URL[] urls = new URL[] {}; MyClassLoader classLoader = new MyClassLoader(urls, null); try { classLoader.addJar(new File("c:/hello.jar").toURI().toURL()); Class<?> clazz = classLoader.loadClass("com.flyingzl.Util"); Method method = clazz.getDeclaredMethod("getVersion"); method.invoke(null); classLoader.close(); } catch (Exception e) { e.printStackTrace(); } } static class MyClassLoader extends URLClassLoader { public MyClassLoader(URL[] urls) { super(urls); } public MyClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent); } public void addJar(URL url) { this.addURL(url); } } } 注意:这里仅仅是为了展示如何动态加载jar包,代码写得很粗,生产代码需要有更完善的异常处理。我们只关心如何动态加载jar包即可。 动态加载jar包,需要用到java.net.URLClassLoader这个类,它可以指定一个路径将jar包或者classes文件加载到类空间。加载完毕后,直接调用loadClass就可以加载指定的类,然后通过反射生成实例或者调用方法即可。 其实,Tomcat等服务器也利用了此思路,比如每一个web应用启动时,它都会自动加载其下的lib文件夹下的jar包。 运行程序,我们就可以看到程序正常输出:
  • 打赏
  • 举报
回复
引用 2 楼 q123501p 的回复:
假设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现? ......
学习!
Usher丶AckMan 2015-12-28
  • 打赏
  • 举报
回复
项目管理工具:maven,gradle

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧