大家应该都听过热部署。热部署可以使应用程序在不全部重新编译,不停止服务的情况下,增加新功能,修复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动态加载类详解 Java动态加载类是Java编程中一项强大的特性,它允许程序在运行时决定并加载具体的类,这为实现高度灵活、可扩展的系统提供了基础。本文将深入探讨Java动态加载类的概念、应用场景以及其实现...
### Java动态加载类知识点总结 Java动态加载类的概念,是指在运行时通过反射机制加载类的一种技术。这在Java中是通过`java.lang.Class`类提供的方法来实现的,最常用的方法是`Class.forName(String className)`。...
"插件化:动态加载类(无法加载资源)"这一主题涉及到的关键知识点主要围绕Android插件化原理、动态加载类的方法以及资源加载问题的解决策略。 首先,Android插件化的核心思想是将应用程序拆分成主程序(宿主)和...
在Android应用开发中,动态加载类是一项重要的技术,它允许应用程序在运行时加载新的功能或者更新已有代码,而无需重新安装整个应用。本篇将详细解释如何在Android中实现动态加载类,主要涉及两种ClassLoader:...
在“反射,动态加载指定类调用类中的方法”这个主题中,我们将深入探讨如何使用反射来实现动态加载和执行类的方法。首先,我们需要理解几个关键的反射API: 1. `Class<?>`: 这是所有Java类的通用表示,通过`Class....
2. 不应该动态加载类 动态加载的类可能包含由静态类初始化程序执行的恶意代码,从而导致安全漏洞。 解决方案:暂无,需要进一步讨论和评估。 3. 应该使用 SQL 绑定机制 使用 SQL 拼接的方式可能会导致 SQL 注入...
动态加载类通常涉及自定义ClassLoader,这是因为它允许我们覆盖默认的加载行为,例如从网络、数据库或其他非标准位置加载类。 对于Java源文件动态编译,我们可以使用Java的内置工具`javac`或`javax.tools.Java...
2. **加载类**:使用`Class.forName()`方法根据配置文件中的类名动态加载类。 3. **创建对象**:调用`clazz.newInstance()`方法创建类的一个新实例。 4. **设置字段值**:通过`Field`类的`set()`方法为对象的指定...
例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的JAR文件。在热加载场景下,JarinJAR使得在...
ClassLoader动态加载类 简单示例 包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager...
在动态加载类后,反射可用于创建类的实例,调用方法,访问和修改字段,甚至执行私有成员的操作。 5. **代理(Proxy)**: Java的动态代理机制可以在运行时创建实现一组指定接口的新类。这在实现回调、事件监听或者...
在C++编程中,动态加载类是一种非常有用的技巧,它允许程序在运行时根据需要加载和使用未知或未预先编译的类。这种技术通常与插件系统、可扩展性或者模块化软件设计相关联。动态加载类的核心是C++标准库中的`dlopen`...
1. **自定义ClassLoader**:Java允许我们创建自定义的ClassLoader,这通常用于实现动态加载类的需求。自定义ClassLoader需要重写`findClass()`或`loadClass()`方法。`loadClass()`方法是类加载的入口,它会调用`find...
在提供的压缩包中,load.jar和test.jar可能是包含待动态加载类的库文件,而TestDynamic.zip可能是一个包含.dex文件的.zip包。开发者可以通过解析这些文件,利用DexClassLoader进行动态加载的实践。 五、应用场景 1....
Java虚拟机(JVM)有多个内置的类加载器,如Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader,它们按层次结构工作,依次加载类。用户还可以自定义类加载器以满足特定需求,例如加载网络上的类或加密...
java 初始化类 执行类的方法 可以初始化一个class,执行他的有参数或者无参数的方法