大家应该都听过热部署。热部署可以使应用程序在不全部重新编译,不停止服务的情况下,增加新功能,修复bug。使用Java如何实现这样的功能呢?动态加载类功不可没。
先给出一段简单的代码。该程序会修改classpath来增加运行时的jar包,并使用URLClassLoader来加载指定的类,以达到热部署的效果。
p.s. 简化处理的代码片段,不能处理UNC URL,获取home path的时候不考虑Mac平台的特殊性。诸多缺陷仅供演示。
package com.joshua.test; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; import java.util.LinkedList; import java.util.List; import java.util.StringTokenizer; public class ClassLoaderTest { private static final String CLASSPATH_SEPARATOR = System.getProperty("path.separator"); private static ClassLoader classLoader; static { String classPath = System.getProperty("java.class.path"); String homePath = getHomePath(classPath); File[] jars = new File(homePath + "/lib").listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return dir.canRead() & name.endsWith(".jar"); } }); // Add jars in lib dir into classpath. final List<URL> jarPaths = new LinkedList<URL>(); StringBuilder classPathSB = new StringBuilder(classPath); for (File jar : jars) { try { jarPaths.add(jar.toURI().toURL()); classPathSB.append(CLASSPATH_SEPARATOR); classPathSB.append(jar.getPath()); } catch (MalformedURLException e) { e.printStackTrace(); } } // Modify the classpath System.setProperty("java.class.path", classPathSB.toString()); classLoader = AccessController.doPrivileged( new java.security.PrivilegedAction<URLClassLoader>() { @Override public URLClassLoader run() { return new URLClassLoader(jarPaths.toArray(new URL[jarPaths.size()])); } } ); Class clazz = null; try { clazz = classLoader.loadClass("$全类名"); } catch (ClassNotFoundException e) { e.printStackTrace(); } if (clazz == null) System.exit(-1); Object loadedInstance = null; try { loadedInstance = clazz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } if (loadedInstance == null) System.exit(-1); } public static String getHomePath(String classPath) { StringTokenizer st = new StringTokenizer(classPath, File.pathSeparator); String binPath = null; if (st.countTokens() > 0) { binPath = st.nextToken(); } try { return new File(binPath).getCanonicalFile().getParent(); } catch (IOException e) { e.printStackTrace(); return ""; } } }
相关推荐
android服务端动态加载类。 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势...
利用类装载器动态加载类并启动类,进行对文件的加密和解密
这个是一个Java中难得的动态加载类的机制,如果想学习这样经典的技术就下载吧
java动态加载类,里面是个实例。
Android App 如何动态加载类
android 插件化实现,动态加载类,无法加载资源
Java动态加载类小实验.pdf
反射,动态加载指定类调用类中的方法 简单例子
ClassLoader动态加载类 简单示例 包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager...
springboot 、java类热加载、jarinjar、动态编译、自动引用依赖
java 初始化类 执行类的方法 可以初始化一个class,执行他的有参数或者无参数的方法
使用先把help文档里面的数据库导入进去,运行localhost:8080/MyPds/testIndex.html 纯动态加载MVC模式的类桌面开发系统模版.其中已经设定好了动态加载控制器.只需要按照Control文件夹下的模式为特定的控制器Js文件...
DllAddIn动态加载DLL
手机平台动态加载\一般意义下动态加载机制的应用研究
js动态加载
Java语言-动态编译代码并热加载类,js热加载
NULL 博文链接:https://ygsilence.iteye.com/blog/1409257
Java反射动态加载实例类,动态加载实例类,帮助理解反射
下面小编就为大家带来一篇java 利用java反射机制动态加载类的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧