`
yuancihang
  • 浏览: 145196 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

自定义类加载器 三

阅读更多

package com.yuan.common.asm;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.yuan.common.collection.ListEnumeration;
import com.yuan.common.file.FileUtil;


public class ClassesClassLoader extends AbstractClassLoader {
   
    private static final Logger logger = LoggerFactory.getLogger(ClassesClassLoader.class);
   
    private List<String> classesPathList;
   
    public ClassesClassLoader(String classesPath, ClassLoader parent){
        super(parent);
        classesPathList = new ArrayList<String>();
        classesPathList.add(classesPath);
    }
    public ClassesClassLoader(List<String> classesPathList, ClassLoader parent){
        super(parent);
        this.classesPathList = classesPathList;
    }
   
    protected File searchFile(String child){
        for(String classesPath : classesPathList){
            File f = new File(new File(classesPath), child);
            if(f.exists()){
                return f;
            }
        }
        return null;
    }
    protected byte[] loadClassData(String name) throws ClassNotFoundException{
        String child = name.replaceAll("\\.", "/") + ".class";
        File classFile = searchFile(child);
        if(classFile != null){
            try {
                return FileUtil.readBinaryFile(classFile);
            } catch (IOException e) {
                logger.warn(e.getMessage(), e);
                throw new ClassNotFoundException(e.getMessage(), e);
            }
        }

        throw new ClassNotFoundException(name);
    }
   
    protected URL findResource(String name) {
        File f = searchFile(name);
        if(f != null){
            try {
                return f.toURI().toURL();
            } catch (MalformedURLException e) {
                logger.warn(e.getMessage(), e);
            }
        }
       
        return null;
    }
    protected Enumeration<URL> findResources(String name) throws IOException {
        ListEnumeration<URL> list = new ListEnumeration<URL>();
        URL url = findResource(name);
        if(url != null){
            list.add(url);
        }
        return list;
    }

}

分享到:
评论

相关推荐

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

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

    自定义类加载器

    3. **隔离加载**:在不同加载器实例之间创建类的隔离,使得不同版本的同名类可以共存。 ### 总结 自定义类加载器是Java平台灵活性的体现,它允许开发者对类加载过程进行扩展和定制,满足特殊需求。理解类加载器的...

    自定义Java类加载器

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

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

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

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

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

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

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

    自定义类加载代码

    默认情况下,系统提供了三个内置的类加载器:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和AppClassLoader(应用程序类加载器)。自定义类加载器允许开发者根据特定需求扩展加载...

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

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

    ClassLoader类加载器

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

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

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

    tomcat类加载器

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

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

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

    类加载器文件

    #### 三、类加载器的基本概念 1. **Bootstrap ClassLoader**: 这是由JVM内部实现的类加载器,主要用于加载核心Java类库(即所有以`java.*`开头的类)。它是用本地代码实现的,并不继承自`java.lang.ClassLoader`。 ...

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

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

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

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

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

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

    Java类加载器原理

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

    JVM类加载器说明文档

    3. 如果父类加载器为 null(最顶层的启动类加载器),那么会使用启动类加载器进行加载。 4. 如果整个加载过程都没有找到对应的类,就会抛出 ClassNotFoundException。 1.4 Java 程序动态扩展方式 Java 程序的动态...

    java类加载器

    3. **应用程序类加载器(Application Class Loader)**:也称为系统类加载器,它根据`java.class.path`系统属性加载应用的类。这是开发者最常打交道的类加载器。 自定义类加载器允许开发者实现特定的加载逻辑,例如从...

    java 类加载器 加密

    在这个例子中,`EncryptedClassLoader`是我们的自定义加载器,它覆盖了`findClass`方法以处理加密的类。`main`方法中,我们使用`Class.forName`加载类,并传入我们的自定义类加载器。找到main方法后,通过反射调用它...

Global site tag (gtag.js) - Google Analytics