`
sheungxin
  • 浏览: 105843 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义ClassLoader

    博客分类:
  • Java
阅读更多
  • 进行实验
以下代码使用一个自定义类加载器,输出类加载器的层级结构和当前实例使用的类加载器
Class cl=new DefinedClassLoader("d:/").loadClass("HelloWorldServiceImpl");
HelloWorldService helloWorldService=(HelloWorldService)cl.newInstance();
helloWorldService.helloWorld();
ClassLoader loader=cl.getClassLoader();
while(loader!=null){
      System.out.print(loader.getClass().getName()+"->");
      loader=loader.getParent();
}
System.out.println(loader);
System.out.println("helloWorldService实例加载器:"+helloWorldService.getClass().getClassLoader());

从输出可以看出依次:自定义类加载器》应用类加载器》扩展类加载器》根加载器(Bootstrap ClassLoader,非java实现)
com.sx.assess.DefinedClassLoader->sun.misc.Launcher$AppClassLoader->sun.misc.Launcher$ExtClassLoader->null
helloWorldService实例加载器:com.risk.assess.DefinedClassLoader@48533e64

最终helloWorldService实例使用的是自定义类加载器,因为加载类时仅指定了类名称,AppClassLoader在classpath中找不到,最终交给DefinedClassLoader加载。
java类加载器是委托关系,入口加载类会先委托给父加载类进行加载,父加载类加载失败再移交给子类,直到加载成功为止。
引用


  • 自定义类加载器
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class DefinedClassLoader extends ClassLoader{
	
	private String classDir;
	
	public DefinedClassLoader(){
		
	}

	public DefinedClassLoader(String classDir){  
        this.classDir = classDir;  
    }  
  
    @SuppressWarnings("deprecation")  
    @Override  
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        //class文件的路径  
        String classPathFile = classDir + "/" + name + ".class";  
        try {  
            //将class文件进行解密  
            FileInputStream fis = new FileInputStream(classPathFile);  
            ByteArrayOutputStream bos = new ByteArrayOutputStream();  
            encodeAndDecode(fis,bos);  
            byte[] classByte = bos.toByteArray();  
            //将字节流变成一个class  
            return defineClass(classByte,0,classByte.length);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return super.findClass(name);  
    }  
  
    //测试,先将HelloWorldServiceImpl.class文件加密写到工程的class_temp目录下  
    public static void main(String[] args) throws Exception{  
        //配置运行参数  
        String srcPath = "D:/HelloWorldServiceImpl.class";//class原路径  
        String desPath = "d:/class_temp";//class输出的路径  
        String desFileName = srcPath.substring(srcPath.lastIndexOf("/")+1);  
        String desPathFile = desPath + "/" + desFileName;  
        FileInputStream fis = new FileInputStream(srcPath);  
        FileOutputStream fos = new FileOutputStream(desPathFile);  
        //将class进行加密  
        encodeAndDecode(fis,fos);  
        fis.close();  
        fos.close();  
    }  
      
    /** 
     * 加密和解密算法 
     * @param is 
     * @param os 
     * @throws Exception 
     */  
    private static void encodeAndDecode(InputStream is,OutputStream os) throws Exception{  
        int bytes = -1;  
        while((bytes = is.read())!= -1){  
            bytes = bytes ^ 0xff;//和0xff进行异或处理  
            os.write(bytes);  
        }  
    }  
	
}

  • 我的问题
实验中通过自定义类加载器去加载类,在实际项目中我们通常把实例交给spring容器进行管理,由FactoryBean进行创建,如何把自定义类加载与spring进行集成。有待研究。。。

抽空研究了下,成功集成:
http://sheungxin.iteye.com/blog/2352833
0
0
分享到:
评论

相关推荐

    自定义classloader的使用

    自定义Classloader允许开发者根据特定需求定制类的加载逻辑,例如加密类文件、隔离不同版本的库或者动态加载代码。本文将深入探讨自定义Classloader的使用。 一、Classloader的工作原理 Java的类加载机制遵循双亲...

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

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

    定义ClassLoader调用外部jar包

    当我们需要从外部jar包动态加载类时,自定义ClassLoader就显得尤为关键。这篇博文"定义ClassLoader调用外部jar包"探讨了如何创建一个自定义的ClassLoader,以便能够灵活地加载不在应用主类路径(ClassPath)中的jar...

    ClassLoader运行机制 自己写的

    这里我们将详细讨论ClassLoader的运行机制,特别是自定义ClassLoader的设计与实现。 ClassLoader的基本职责是根据类名动态加载对应的类文件。在Java中,类加载过程遵循双亲委派模型(Parent Delegation Model)。这...

    使用自定义ClassLoader解决反序列化serialVesionUID不一致问题 _ 回忆飘如雪1

    标题和描述中提到的解决方案是通过自定义`ClassLoader`来处理`serialVersionUID`不一致的问题。以下是几种常见方法的优缺点以及自定义`ClassLoader`的详细解释: 1. **修改序列化byte数据**: 这种方法直接修改已...

    关于Android中自定义ClassLoader耗时问题的追查

    在Android开发中,自定义ClassLoader是一项关键技能,尤其在实现热修复和插件化技术时。本文主要探讨了Android中自定义ClassLoader导致的性能问题,特别是冷启动速度的影响。问题的核心在于,通过插入自定义的...

    MyCLRepl:自定义 Scala REPL 示例以添加自定义 ClassLoader 和自定义 REPL 命令

    自定义 ClassLoader 加载任何类时的类名。 ":myCommand" 命令位于默认 REPL 命令之上。 scala &gt; val hello = " hello " MyClassLoader loads classOf &lt; root&gt;.$line3 &lt;&lt;中略&gt;&gt; MyClassLoader loads classOf ...

    ClassLoader 案例

    自定义ClassLoader允许开发者根据特定需求加载类,比如动态加载或更新类文件,这在某些高级应用场景中非常有用,如插件系统、热部署等。本案例将深入探讨如何创建一个自定义的ClassLoader,利用Java反射和注解技术...

    ClassLoader小例子

    下面我们将详细讨论ClassLoader的基本概念、工作流程以及如何自定义ClassLoader。 1. **ClassLoader的基本概念** - 类加载器是Java中的一个核心组件,它负责将类的.class文件加载到JVM中,并转换为可执行的Java...

    classloader

    创建自定义类加载器需要继承ClassLoader类,并重写findClass()方法。在这个方法里,你可以编写代码来从指定的位置(例如,网络、文件系统或内存)读取类的字节码,并通过defineClass()方法将其转换为Class对象。 在...

    Java ClassLoader定制实例

    在某些特定场景下,比如动态加载代码、插件系统或者安全隔离等,我们需要自定义ClassLoader来实现特定的加载逻辑。例如,我们可能希望加载网络上的类,或者从数据库中读取类的字节码。 以...

    Understanding the Java ClassLoader

    为了更好地理解和利用Java的这一特性,本篇将详细介绍Java ClassLoader的作用及其工作原理,并通过构建一个示例ClassLoader来帮助读者深入理解如何自定义ClassLoader,从而扩展JVM的功能。 #### 二、ClassLoader...

    ClassLoader类加载器

    了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对ClassLoader API的使用和自定义的详细说明。 首先,我们来看ClassLoader的基本概念。在Java中,...

    ClassLoader类加载机制和原理详解

    但有时我们可能需要打破这种模型,比如实现类的版本控制或插件系统,这时可以通过自定义ClassLoader来实现。 5. 类加载器的关系图 Java中的ClassLoader形成了一个树状结构,Bootstrap ClassLoader位于顶端,其他类...

    ClassLoader的 一些测试

    自定义ClassLoader是一种常见的需求,例如在插件系统、热部署等场景。自定义加载器通常需要重写`loadClass(String className)`方法,通过URL读取类的字节流并转换为Class对象。在这个过程中,我们需要注意类的缓存,...

    理解Java ClassLoader机制

    自定义ClassLoader需要继承`java.lang.ClassLoader`类,并重写`findClass()`或`loadClass()`方法。通过这两个方法,你可以控制类的加载来源和方式。 在实际开发中,理解ClassLoader机制可以帮助解决一些问题,例如...

    ClassLoader 详解.doc

    自定义ClassLoader是Java平台的一大特色,开发人员可以根据需要创建自己的类加载器,例如实现模块化、热部署或者加密解密类等高级功能。自定义ClassLoader通常需要重写findClass()或loadClass()方法,以控制类的加载...

    java classloader

    在Java中,用户可以通过自定义ClassLoader来实现特定的加载逻辑,比如从数据库或网络中加载类。这使得Java可以支持许多高级功能,例如插件系统、热部署和模块化系统(如Java 9的Jigsaw项目)。 `JAVA2深度历险.jpg`...

    浅析ClassLoader

    1. 自定义需求:在某些场景下,如动态加载插件、加密类文件等,开发者可能需要自定义ClassLoader。自定义ClassLoader需要继承java.lang.ClassLoader并重写findClass()方法。 2. 实现步骤:创建类加载器实例,读取类...

Global site tag (gtag.js) - Google Analytics