`

动态加载class文件

阅读更多
1.参考老外:
public class ClassPathUpdater {

    /** Used to find the method signature. */

    private static final Class[] PARAMETERS = new Class[] { URL.class };



    /** Class containing the private addURL method. */

    private static final Class CLASS_LOADER = URLClassLoader.class;



    /**

     * Adds a new path to the classloader. If the given string points to a file,

     * then that file's parent file (i.e., directory) is used as the directory

     * to add to the classpath. If the given string represents a directory, then

     * the directory is directly added to the classpath.

     * 

     * @param s

     * The directory to add to the classpath (or a file, which will

     * relegate to its directory).

     */

    public static void add(String s) throws IOException, NoSuchMethodException,

            IllegalAcces***ception, InvocationTargetException {

        add(new File(s));

    }



    /**

     * Adds a new path to the classloader. If the given file object is a file,

     * then its parent file (i.e., directory) is used as the directory to add to

     * the classpath. If the given string represents a directory, then the

     * directory it represents is added.

     * 

     * @param f

     * The directory (or enclosing directory if a file) to add to the

     * classpath.

     */

    public static void add(File f) throws IOException, NoSuchMethodException,

            IllegalAcces***ception, InvocationTargetException {

        f = f.isDirectory() ? f : f.getParentFile();

        add(f.toURI().toURL());

    }



    /**

     * Adds a new path to the classloader. The class must point to a directory,

     * not a file.

     * 

     * @param url

     * The path to include when searching the classpath.

     */

    public static void add(URL url) throws IOException, NoSuchMethodException,

            IllegalAcces***ception, InvocationTargetException {

        Method method = CLASS_LOADER.getDeclaredMethod("addURL", PARAMETERS);

        method.setAccessible(true);

        method.invoke(getClassLoader(), new Object[] { url });

    }



    private static URLClassLoader getClassLoader() {

        return (URLClassLoader) ClassLoader.getSystemClassLoader();

    }

}


     ClassPathUpdater.add("E:\\workspaces\\MyDemos\\MyClass.class");
        String path = "E:\\workspaces\\MyDemos\\";
        URL url = new URL("file", null, path);
        URLClassLoader loader = new URLClassLoader(new URL[] {url});
        Class clazz = loader.loadClass("MyClass");
2.rewrite ClassLoader
static class MyClassLoader extends ClassLoader {

        @Override

        public Class<?> findClass(String name) {

            try {

                FileInputStream in = new FileInputStream(name);

                ArrayList<Byte> l = new ArrayList<Byte>();

                int c;

                while ((c = in.read()) != -1) {

                    l.add(new Byte((byte)c));

                }

                byte[] b = new byte[l.size()];

                for (int i = 0; i < l.size(); i++) {

                    b[i] = l.get(i).byteValue();

                }

                

                return defineClass(b, 0, b.length);

            } catch (Exception e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            return null;

        }

    }


MyClassLoader mcl = new MyClassLoader();
        clazz = mcl.loadClass("E:\\workspaces\\MyDemos\\MyClass.class");
分享到:
评论

相关推荐

    android动态加载class文件(DexClassLoader可从SD卡加载)(android插件开发)

    在Android系统中,动态加载Class文件是实现插件化、热修复等高级功能的关键技术。标题中的"android动态加载class文件(DexClassLoader可从SD卡加载)"指的是利用Android的DexClassLoader类来实现从外部存储(如SD卡...

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

    这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...

    jvm 加载class文件

    ### JVM加载Class文件详解 #### 一、Java与JVM中的Class文件加载机制概述 Java作为一种动态性极强的解释型编程语言,在程序运行时,Java虚拟机(JVM)负责将编译生成的`.class`文件加载到内存中进行执行。在Java...

    android 动态加载class

    总结起来,Android 动态加载Class涉及到的关键技术包括:自定义ClassLoader、Dex文件操作、反射、权限管理以及Android的类加载机制。这一技术在提高程序灵活性和维护性的同时,也需要开发者对Android系统的深入了解...

    使用classloader动态加载Class

    总之,理解并掌握如何使用ClassLoader动态加载Class是Java开发中的重要技能,它能帮助我们构建更灵活、可扩展的系统。在实现过程中,要兼顾性能、安全和可维护性,合理设计类加载策略,确保代码的高效运行。

    Android动态加载技术的研究.pdf

    Android动态加载技术是指在Android系统中,通过加载Class文件实现应用程序的更新和升级,而无需重新安装APK文件。这种技术可以提高用户体验,减少用户更新应用程序的麻烦。 Android动态加载技术的研究可以分为以下...

    java热加载Class文件

    总之,Java热加载Class文件是提高开发效率的有效手段,它通过动态替换和更新类,使得开发者能够在不重启JVM的情况下观察代码更改的效果。了解并掌握这项技术,对于提升Java开发者的生产力具有重要意义。

    Java 动态加载jar文件示例

    然后在`findClass()`方法中,我们根据类名查找对应的.class文件,读取其内容并将其转换为字节数组,最后调用`defineClass()`方法定义并返回这个类。 使用自定义类加载器后,我们可以在程序运行时动态加载jar文件中...

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。...Java动态加载class; Java覆盖已加载的class; Java自定义classloader;

    class文件热加载,上传class文件实现热加载

    "class文件热加载,上传class文件实现热加载"这个主题主要涉及到Java应用的运行时动态更新机制。下面将详细介绍这个过程及其相关知识点。 1. **Java类加载器**: - Java虚拟机(JVM)通过类加载器来加载类。默认有...

    Spring动态加载配置文件

    对于动态加载,我们可以利用`Resource`接口和`ClassPathResource`类来加载运行时变更的属性文件。 除了这两种方式,Spring Boot引入了更强大的`ConfigDataLocationResolver`和`ConfigDataLoader`接口,它们允许我们...

    java热加载Class文件.zip

    Java热加载Class文件技术是一种在不重启应用服务器的情况下更新或替换正在运行的Java类的方法,这对于开发者来说是一项非常实用的功能,因为它极大地提高了开发效率。在传统的开发过程中,修改代码后通常需要停止、...

    JVM加载class文件的原理机制

    JVM加载class文件的原理机制 JVM加载class文件的原理机制是Java中的核心机制之一,由于Java中的所有类必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的。类装载器所做的工作实质是把类文件从硬盘...

    Spring bean 动态注册,jar包热替换

    spring的bean动态加载则需要对相应的bean进行动态注册,以及jar与class文件动态加载。测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录...

    动态加载dex动态加解密dex文件

    本篇文章将深入探讨“动态加载dex动态加解密dex文件”这一主题,以及如何实现APP的加固原理。 首先,我们要理解Dex文件。Dex是Dalvik Executable的缩写,它是Android应用的主要代码格式。Dalvik虚拟机负责执行这些...

    JVM加载class文件的原理机制.pdf

    JVM加载class文件的原理机制 JVM加载class文件的原理机制是Java虚拟机中一个非常重要的组件,负责将class文件加载到内存中,以便Java程序的执行。下面是JVM加载class文件的原理机制的详细介绍: 类加载的原理 在...

    动态加载jar包

    4. **加载类**:对于每个类文件,使用自定义类加载器的`defineClass()`方法将其字节码转换为Class对象。这个过程涉及解码字节码、校验类信息,然后创建Class对象。 5. **反射调用方法**:一旦类被加载,我们可以...

    asm动态生成class,并且动态加载执行

    NULL 博文链接:https://name327.iteye.com/blog/1554558

    android动态加载jar文件

    “dx处理”是指使用dx命令行工具,将.jar文件中的.class文件转换成.dex文件。这个过程是必要的,因为Android系统只能理解和执行.dex格式的代码。转换的命令通常如下: ``` dx --dex --output=classes.dex ...

    C# WinForm 动态加载DLL 通过配置文件

    总结来说,C# WinForm通过配置文件动态加载DLL的关键步骤包括:读取配置文件中的DLL路径,使用`Assembly.LoadFrom`加载DLL,通过反射获取并实例化DLL中的类,最后调用类的方法执行功能。这种方法提高了代码的可维护...

Global site tag (gtag.js) - Google Analytics