`
eddiegift
  • 浏览: 27719 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

自定义类加载器

    博客分类:
  • J2SE
阅读更多
package com;

import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.reflect.Method;

public class CustomClassLoader extends URLClassLoader {
    private FileInputStream input = null;  //文件输入流
    private ByteArrayOutputStream out = null;  //字节数组输出流
    private String[] url = null;  //类文件加载路径
    private byte[] data = null; //类文件字节码
    private String extensionalName = ""; //类文件扩展名

    public CustomClassLoader(URL[] urls) throws Exception{
        super(urls);
        this.url = new String[urls.length];
        for (int i = 0; i < urls.length; i++) {
             this.url[i] = urls[i].toURI().toString();
        }
    }
    
    /*
     * 解析URL 
     */
    private void setFilePath() {
        for (int i = 0; i < this.url.length; i++) {
            if (this.url[i].substring(0,4).toLowerCase().equals("file") == true) {
                this.url[i] = this.url[i].substring(5);
            }
        }
    }

    /*
     * 获得指定类名(包名+类名)文件的字节码
     * @name name String
     * @return byte[]
     */
    private byte[] getFileData(String name) {
        try {
            this.setFilePath();
            for (String url : this.url) {
                String fileName = url + name.replace('.', '/').concat(".") +
                                  this.getExtensionalName();
                input = new FileInputStream(new File(fileName));
                if (input != null) {
                    break;
                }
            }          
            
            out = new ByteArrayOutputStream();
            data = new byte[1024];
            int len = -1;
            while ((len = input.read(data)) != -1) {
                out.write(data, 0, len);
            }
            data = out.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (input != null)
                    input.close();
                if (out != null)
                    out.close();
                return data;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }

    /*
     * 根据指定类名查找类文件
     * @param name String
     * @return Class
     */
    protected Class findClassByName(String name) {
        try {
            byte[] data = this.getFileData(name);
            if (data == null) {
                return null;
            }
            return this.defineClass(name, data, 0, data.length);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    /*
     * 重写loadClass()方法
     * @param name String
     * @return Class
     */
    public Class loadClass(String name) {
        Class c = null;        
        try {
            c = super.loadClass(name);        
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (c == null) //父类默认方法没有加载到指定类时,使用自定义方法查找
                c = this.findClassByName(name);
            return c;
        }
    }

    public String getExtensionalName() {
        return extensionalName;
    }

    public void setExtensionalName(String extensionalName) {
        this.extensionalName = extensionalName;
    }



    public static void main(String[] args) throws Exception {
        URL[] url = new URL[] {new URL("file:e:/")}; //添加你想要加载类的路径
                                                     //网络或本地均可
        CustomClassLoader csl = new CustomClassLoader(url);
        csl.setExtensionalName("rs");
        Class c1 = csl.loadClass("com.demo");
        Object obj = c1.newInstance();
        Method method = c1.getMethod("printText", null);
        method.invoke(obj, null);
    }
}

6
3
分享到:
评论
4 楼 eddiegift 2008-04-07  
不必特意配置,开发时放在你的WebRoot下的一个文件夹中就行
3 楼 eddiegift 2008-04-07  
这个自定义类加载器主要用于控制某个程序的一个关键类的只能在线加载,所以类文件本身不必太大
2 楼 雁行 2008-03-17  
自定义类加载器好写,如何配置到tomcat里似乎麻烦些
1 楼 wf_chn 2008-03-16  
你的class文件要是超过1k能加载成功吗

相关推荐

    自定义类加载器实现自定义加载

    在Java编程语言中,类加载器(ClassLoader)是运行时环境...理解类加载机制并正确实现自定义加载器是提升Java应用开发能力的重要一步。在实际项目中,合理利用类加载器可以解决很多复杂问题,比如模块化、动态更新等。

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    自定义Java类加载器

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

    Java加壳源码-自定义类加载器

    默认的类加载器包括Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和AppClassLoade(应用程序类加载器),它们按照双亲委派模型工作。 自定义类加载器的创建通常涉及以下步骤: 1...

    java类加载器学习二、自定义类加载器

    java类加载器学习二、自定义类加载器

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

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

    Java实现的自定义类加载器示例

    Java 实现的自定义类加载器示例 Java 实现的自定义类加载器是 Java 语言中的一种机制,允许开发者自定义类加载器,以满足特定的需求。本文将详细介绍 Java 实现的自定义类加载器的原理和实现技巧。 ClassLoader 类...

    tomcat类加载器

    这个"DevLoader.zip"文件可能包含与Tomcat自定义类加载器相关的资料,特别是名为"DevLoader"的类加载器,这可能是Tomcat为开发者提供的一种特殊加载器。 首先,我们来理解一下类加载器的基本概念。在Java中,类加载...

    自定义类加载代码

    本篇将深入探讨自定义类加载器的实现、双亲委派模型以及如何指定父类加载器。 首先,我们来了解自定义类加载器的实现。在Java中,类加载的过程包括加载、验证、准备、解析和初始化。当JVM需要加载一个类时,它会...

    3-7Tomcat中自定义类加载器的使用与源码实现(2).mp4

    3-7Tomcat中自定义类加载器的使用与源码实现(2).mp4

    java自定义类加载器代码示例

    Java自定义类加载器代码示例 Java自定义类加载器代码示例是一种使用Java语言实现的类加载器示例,主要用于加载Java类文件。类加载器是Java虚拟机(JVM)中的一种机制,用于将Java类文件加载到JVM中,以便JVM可以...

    ClassLoader类加载器

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

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

    ### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载机制是其动态特性的核心之一。通过类加载器(Class Loader),Java程序能够在运行时根据需要加载所需的类,从而实现高度的灵活性...

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

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

    JCL:Jar Class Loader,一个可配置的动态自定义类加载器,旨在在IoC框架和Web应用程序中创建,管理和操作隔离的Java类加载器。

    JCL是可配置,动态和可扩展的自定义类加载器,可直接从Jar文件和其他来源加载Java类。 这样做的动机是创建隔离的类加载器,该类加载器可以轻松地与IoC框架(如Spring)和Web应用程序集成。 整个库,包括其代码库和...

    Java语言中的自定义类加载器实例解析

    Java语言中的自定义类加载器(Custom Class Loader)允许开发者扩展Java虚拟机(JVM)的类加载机制,以便从非标准位置加载类。在Java中,类的加载过程遵循“双亲委派模型”(Parent Delegation Model),即一个类...

    类加载器文件

    这种设计遵循了**委托模式**,即自定义类加载器在尝试加载类之前会先询问其父加载器是否能加载该类,只有在父加载器无法加载时才会尝试自己加载。 #### 八、类的卸载与重载 1. **卸载**: Java类一旦被加载到JVM中...

    Java类加载器原理

    - `findClass()`:从Java 1.2开始,自定义类加载器通常只需要重写此方法,当父类加载器找不到类时,此方法会被调用来查找类。 - `defineClass()`:这是一个final方法,用于将字节数组转换为Class对象,实现字节码...

    JVM类加载器说明文档

    2. 安全性问题:如果允许用户自定义类加载器任意加载代码,可能会破坏系统的安全策略,因为类加载器可以加载不受限制的代码。 3. 单例模式的实现:在多线程环境中,如果每个线程都有自己的类加载器,可能导致单例...

Global site tag (gtag.js) - Google Analytics