`

动态加载类

    博客分类:
  • Java
阅读更多

 

大家应该都听过热部署。热部署可以使应用程序在不全部重新编译,不停止服务的情况下,增加新功能,修复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动态加载类

    android服务端动态加载类。  在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势...

    动态加载类机制JAVA

    在Java编程语言中,动态加载类机制是一种强大的功能,它允许程序在运行时根据需要加载新的类或资源,而不是在编译时确定所有类。这种技术对于提高软件的灵活性、可扩展性和模块化至关重要,特别是在大型系统和插件式...

    java动态加载类

    ### Java动态加载类详解 Java动态加载类是Java编程中一项强大的特性,它允许程序在运行时决定并加载具体的类,这为实现高度灵活、可扩展的系统提供了基础。本文将深入探讨Java动态加载类的概念、应用场景以及其实现...

    Java动态加载类小实验.pdf

    ### Java动态加载类知识点总结 Java动态加载类的概念,是指在运行时通过反射机制加载类的一种技术。这在Java中是通过`java.lang.Class`类提供的方法来实现的,最常用的方法是`Class.forName(String className)`。...

    插件化:动态加载类(无法加载资源)

    "插件化:动态加载类(无法加载资源)"这一主题涉及到的关键知识点主要围绕Android插件化原理、动态加载类的方法以及资源加载问题的解决策略。 首先,Android插件化的核心思想是将应用程序拆分成主程序(宿主)和...

    Android App 如何动态加载类.doc

    在Android应用开发中,动态加载类是一项重要的技术,它允许应用程序在运行时加载新的功能或者更新已有代码,而无需重新安装整个应用。本篇将详细解释如何在Android中实现动态加载类,主要涉及两种ClassLoader:...

    反射,动态加载指定类调用类中的方法

    在“反射,动态加载指定类调用类中的方法”这个主题中,我们将深入探讨如何使用反射来实现动态加载和执行类的方法。首先,我们需要理解几个关键的反射API: 1. `Class&lt;?&gt;`: 这是所有Java类的通用表示,通过`Class....

    sonarqube代码规范整理_jchaoy

    2. 不应该动态加载类 动态加载的类可能包含由静态类初始化程序执行的恶意代码,从而导致安全漏洞。 解决方案:暂无,需要进一步讨论和评估。 3. 应该使用 SQL 绑定机制 使用 SQL 拼接的方式可能会导致 SQL 注入...

    Java类动态加载(一)——java源文件动态编译为class文件

    动态加载类通常涉及自定义ClassLoader,这是因为它允许我们覆盖默认的加载行为,例如从网络、数据库或其他非标准位置加载类。 对于Java源文件动态编译,我们可以使用Java的内置工具`javac`或`javax.tools.Java...

    Java反射动态加载实例类

    2. **加载类**:使用`Class.forName()`方法根据配置文件中的类名动态加载类。 3. **创建对象**:调用`clazz.newInstance()`方法创建类的一个新实例。 4. **设置字段值**:通过`Field`类的`set()`方法为对象的指定...

    springboot+java类热加载

    例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的JAR文件。在热加载场景下,JarinJAR使得在...

    ClassLoader:ClassLoader动态加载类

    ClassLoader动态加载类 简单示例 包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager...

    动态编译、加载java类

    在动态加载类后,反射可用于创建类的实例,调用方法,访问和修改字段,甚至执行私有成员的操作。 5. **代理(Proxy)**: Java的动态代理机制可以在运行时创建实现一组指定接口的新类。这在实现回调、事件监听或者...

    动态加载Cpp类示例.rar

    在C++编程中,动态加载类是一种非常有用的技巧,它允许程序在运行时根据需要加载和使用未知或未预先编译的类。这种技术通常与插件系统、可扩展性或者模块化软件设计相关联。动态加载类的核心是C++标准库中的`dlopen`...

    使用classloader动态加载Class

    1. **自定义ClassLoader**:Java允许我们创建自定义的ClassLoader,这通常用于实现动态加载类的需求。自定义ClassLoader需要重写`findClass()`或`loadClass()`方法。`loadClass()`方法是类加载的入口,它会调用`find...

    Android中的动态加载机制(折腾版) 源码

    在提供的压缩包中,load.jar和test.jar可能是包含待动态加载类的库文件,而TestDynamic.zip可能是一个包含.dex文件的.zip包。开发者可以通过解析这些文件,利用DexClassLoader进行动态加载的实践。 五、应用场景 1....

    Java技术----实现JAVA的动态类载入机制

    Java虚拟机(JVM)有多个内置的类加载器,如Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader,它们按层次结构工作,依次加载类。用户还可以自定义类加载器以满足特定需求,例如加载网络上的类或加密...

    java 动态加载类

    java 初始化类 执行类的方法 可以初始化一个class,执行他的有参数或者无参数的方法

Global site tag (gtag.js) - Google Analytics