`

MyClassLoader 自定义类加载器

    博客分类:
  • Java
 
阅读更多
package demo;

import java.io.*;

public class MyClassLoader extends ClassLoader {
    private static final int BUFFER_SIZE = 8192;

    protected synchronized Class loadClass(String className, boolean resolve) 
                                 throws ClassNotFoundException {
        log("Loading class: " + className + ", resolve: " + resolve);

        // 1. is this class already loaded?
        Class cls = findLoadedClass(className);
        if (cls != null) {
            return cls;
        }

        // 2. get class file name from class name
        String clsFile = className.replace('.', '/') + ".class";
        
        // 3. get bytes for class
        byte[] classBytes = null;
        try {
            InputStream in = getResourceAsStream(clsFile);
            byte[] buffer = new byte[BUFFER_SIZE];
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int n = -1;
            while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
                out.write(buffer, 0, n);
            }
            classBytes = out.toByteArray();
        }
        catch (IOException e) {
            log("ERROR loading class file: " + e);
        }

        if (classBytes == null) {
            throw new ClassNotFoundException("Cannot load class: " + className);
        }

        // 4. turn the byte array into a Class
        try {
            cls = defineClass(className, classBytes, 0, classBytes.length);
            if (resolve) {
                resolveClass(cls);
            }
        }
        catch (SecurityException e) { 
            // loading core java classes such as java.lang.String
            // is prohibited, throws java.lang.SecurityException.
            // delegate to parent if not allowed to load class
            cls = super.loadClass(className, resolve);
        }

        return cls;
    }

    private static void log(String s) {
        System.out.println(s);
    }
}


Test code:

package demo;

public class TestClassLoader {
    public static void main(String[] args) throws Exception {
        MyClassLoader loader1 = new MyClassLoader();
        
        // load demo.Base64
        Class clsB64 = Class.forName("demo.Base64", true, loader1);
        System.out.println("Base64 class: " + clsB64);

        if (Base64.class.equals(clsB64)) {
            System.out.println("Base64 loaded through custom loader is the same as that loaded by System loader.");
        }
        else {
            System.out.println("Base64 loaded through custom loader is NOT same as that loaded by System loader.");
        }

        // call the main method in Base64
        java.lang.reflect.Method main = clsB64.getMethod("main", 
                                                new Class[] {String[].class});
        main.invoke(null, new Object[]{ new String[]{} });
    }
}

分享到:
评论

相关推荐

    自定义Java类加载器

    - **安全沙箱**:每个加载器都有自己的命名空间,可以通过自定义加载器限制代码访问权限。 - **插件系统**:插件有自己的类加载器,使得插件可以独立于主程序加载和卸载。 在编写`MyClassLoader`时,需要注意的是,...

    自定义类加载代码

    在这个例子中,`MyClassLoader`首先尝试从自定义的位置加载类,如果失败,则将请求委派给父类加载器。 总之,自定义类加载器提供了一种灵活的方式来控制类的加载过程,满足特殊的应用场景,如动态加载、模块化系统...

    Java基于自定义类加载器实现热部署过程解析

    "Java基于自定义类加载器实现热部署过程解析" Java中基于自定义类加载器实现热部署是指在不重启应用的情况下,当类的定义即字节码文件修改后,能够替换该Class创建的对象。热部署是Java中的一个重要概念,它可以...

    java自定义类加载classloader文档,包括代码

    上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...

    ClassLoader类加载器

    3. Application ClassLoader:也称为系统类加载器,负责加载用户类路径`-cp`或`-classpath`指定的所有类。 当一个类被加载时,如果它的父类加载器无法加载该类,那么会将任务委派给子类加载器。这就是著名的"委托...

    java 类加载与自定义类加载器详解

    自定义加载器需要重写`findClass()`或`loadClass()`方法。在`MyClassLoader2`示例中,它尝试从指定路径查找类的字节码文件,并通过`defineClass()`方法将字节码转换为Class对象。 ```java public Class<?> find...

    JAVA-JVM-01类加载机制

    在自定义类加载器示例中,我们创建了一个名为`MyClassLoader`的类,它继承了`ClassLoader`。在`loadClass()`方法中,实现了双亲委派机制,先尝试父加载器,然后是当前类加载器的`findClass()`方法。`findClass()`...

    JAVA文件中调用已编译的.CLASS的类.doc

    Java允许我们通过自定义类加载器或者使用内置的`ClassLoader`来实现这一功能。以下是一份详细的步骤和知识点解释: 1. **创建Java接口和实现**: - 首先,定义一个公共接口,例如`ActionInterface`,它包含一个...

    ClassLoader实例

    首先,Java类加载器分为系统类加载器和自定义类加载器。系统类加载器包括引导类加载器、扩展类加载器和系统类加载器: 1. 引导类加载器(Bootstrap Class Loader):由JVM原生代码实现,负责加载JDK核心库,如rt....

    java基础学习笔记之类加载器

    以下是一个简化的自定义类加载器示例: ```java public class MyClassLoader extends ClassLoader { @Override protected Class<?> findClass(String className) throws ClassNotFoundException { // 实现自定义...

    从一个小例子来看动态卸载class

    当我们需要加载类时,使用自定义类加载器而非系统类加载器,这样可以控制何时加载特定的类。 例如,我们可以创建一个名为`MyClassLoader`的类加载器,其加载类的方式如下: ```java public class MyClassLoader ...

    Java类加载

    本文详细介绍了 Java 类加载机制的基本概念,包括类加载的过程、初始化时机、类加载器的工作原理及其分类,并提供了一个自定义类加载器的示例。通过这些内容的学习,可以帮助开发者更好地理解 Java 类加载机制,为...

    java 动态加载jar包

    为了实现动态加载,我们需要一个管理插件的框架,它可以监听新插件的添加,使用自定义类加载器加载它们,并提供插件的生命周期管理。例如,我们可以创建一个PluginManager类,用于管理和加载插件: ```java public ...

    Dynamic Class Loading in the Java Virtual Machine

    下面是一个简单的用户自定义类加载器示例: ```java public class MyClassLoader extends ClassLoader { private String path; public MyClassLoader(String path) { this.path = path; } @Override ...

    Java类热替换(热部署)源码

    1. **继承自ClassLoader**:创建一个新的类加载器,如`MyClassLoader extends ClassLoader`。 2. **覆盖findClass方法**:这是类加载的关键部分,你需要在这里读取并加载新的字节码文件。例如,你可以使用`java.nio...

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

    在Java编程中,类动态加载是一项重要的技术,它允许程序在运行时根据需要加载新的类,从而提高了灵活性和可...在实际应用中,我们需要注意类加载的性能影响,以及类加载器之间的隔离问题,以确保系统的稳定性和安全性。

    ClassLoader 案例

    `loadClass()` 方法通常用于委托父类加载器加载类,如果父类加载器无法加载,再由当前类加载器尝试加载。`findClass()` 方法则负责根据类名查找对应的二进制字节流,并转换为Class对象。 在描述中提到,该案例会...

    Java动态代理机制详解[整理].pdf

    此外,用户还可以自定义类加载器,如示例中的`MyClassLoader`,以便实现特殊的需求,如从非标准位置加载类。 在示例代码中,我们看到一个名为`Programmer`的类,它有一个`code()`方法。这个类被编译为`Programmer....

    运用加密技术保护Java源代码

    通过创建自定义的类加载器,可以在类文件加载前对其进行解密,确保只有授权的用户能够访问原始源代码。 3. **Java Cryptography Extension (JCE)**:为了实施加密/解密操作,开发者需要熟悉JCE提供的API,以便正确地...

    如何有效防止Java程序源码被人偷窥.doc

    这样,JVM会使用我们的自定义加载器来处理类文件,包括解密操作。Listing 1展示了如何使用自定义ClassLoader加载类文件的基本步骤。 ```java ClassLoader myClassLoader = new MyClassLoader(); Class<?> myClass =...

Global site tag (gtag.js) - Google Analytics