博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义ClassLoader
阅读量:6223 次
发布时间:2019-06-21

本文共 2703 字,大约阅读时间需要 9 分钟。

   由于ClassLoader的单亲委托结构,保证了JVM中加载的类的安全性。BootstrapClassloader会加载java核心库(例如:java.lang.*等);ExtClassloader会加载jdk安装目录下的ext目录下的jar包(即jdk1.6.0_18\jre\lib\ext),包括dnsns.jar、sunjce_provider.jar...等;AppClassloader会加载当前目录(即'.')和classpath中内容。在加载的过程中,会尽量尝试用父亲去加载,父亲如果不加载,才尝试子Classloader加载。

   自定义Classloader具有相当的实际意义,例如在同一环境下需要多个同一字节码的多个Class模型(Jboss容器中多个应用使用同一类,但彼此隔离,完全没有关系)。

   查看java的源代码,java中的调用关系如下:ClassLoader类的loadClass(String name) -》loadClass(String name, boolean resolve) [会先尝试父亲加载,父亲不加载才ClassLoader加载]-》findClass(String name),而此方法的实现为空,因此自定义的Classloader需要复写findClass(String name)

 
  1. package org.apache.jmeter.loader; 
  2.  
  3. import java.io.ByteArrayOutputStream; 
  4. import java.io.File; 
  5. import java.io.FileInputStream; 
  6. import java.io.FileNotFoundException; 
  7. import java.io.IOException; 
  8. import java.nio.ByteBuffer; 
  9. import java.nio.channels.Channels; 
  10. import java.nio.channels.FileChannel; 
  11. import java.nio.channels.WritableByteChannel; 
  12.  
  13. /** 
  14.  * TODO Comment of JmeterClassLoader 
  15.  *  
  16.  * @author keju.wangkj 
  17.  */ 
  18. public class JmeterClassLoader extends ClassLoader { 
  19.     private static final String SUFFIX  = ".class"
  20.     private String              baseDir = System.getProperty("user.dir"); 
  21.  
  22.     public JmeterClassLoader() { 
  23.         super(); 
  24.     } 
  25.  
  26.     public JmeterClassLoader(String baseDir) { 
  27.         this.baseDir = baseDir; 
  28.     } 
  29.  
  30.     public JmeterClassLoader(ClassLoader parent, String baseDir) { 
  31.         super(parent); 
  32.         this.baseDir = baseDir; 
  33.     } 
  34.  
  35.     public Class<?> findClass(String className) throws ClassNotFoundException { 
  36.         Class<?> clazz = this.findLoadedClass(className); 
  37.         if (null == clazz) { 
  38.             try { 
  39.                 String classFile = getClassFile(className); 
  40.                 FileInputStream fis = new FileInputStream(classFile); 
  41.                 FileChannel fileC = fis.getChannel(); 
  42.                 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  43.                 WritableByteChannel outC = Channels.newChannel(baos); 
  44.                 ByteBuffer buffer = ByteBuffer.allocateDirect(1024); 
  45.                 while (true) { 
  46.                     int i = fileC.read(buffer); 
  47.                     if (i == 0 || i == -1) { 
  48.                         break
  49.                     } 
  50.                     buffer.flip(); 
  51.                     outC.write(buffer); 
  52.                     buffer.clear(); 
  53.                 } 
  54.                 fis.close(); 
  55.                 byte[] bytes = baos.toByteArray(); 
  56.  
  57.                 clazz = defineClass(className, bytes, 0, bytes.length); 
  58.             } catch (FileNotFoundException e) { 
  59.                 e.printStackTrace(); 
  60.             } catch (IOException e) { 
  61.                 e.printStackTrace(); 
  62.             } 
  63.         } 
  64.         return clazz; 
  65.     } 
  66.  
  67.     private String getClassFile(String name) { 
  68.         StringBuffer sb = new StringBuffer(baseDir); 
  69.         name = name.replace('.', File.separatorChar) + SUFFIX; 
  70.         sb.append(File.separator + name); 
  71.         return sb.toString(); 
  72.     } 
  73.  
  74.     /* 
  75.      * (non-Javadoc) 
  76.      * @see java.lang.Object#toString() 
  77.      */ 
  78.     @Override 
  79.     public String toString() { 
  80.         return this.getClass().getName(); 
  81.     } 

 其中的findClass()将被classloader类中loadclass方法所调用,所以使用时可以直接调用loadclass方法即可,此为模板方法模式的典型使用。

 2、卸载问题

loader1 = null;

clazz = null;

object = null;

 

 本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/640743,如需转载请自行联系原作者

你可能感兴趣的文章
70、二维码生成+圆形头像
查看>>
Pazera Free Audio Extractor 中文版 - 轻松将视频背景音乐/对话音频提取出来的免费软件...
查看>>
读取spring配置文件的方法(spring读取资源文件)
查看>>
PostConstruct
查看>>
MyEclipse------快速读取特定目录下的文件的内容(字节输入流)
查看>>
Linq查询操作之排序操作
查看>>
Spring 4支持的Java 8新特性一览
查看>>
RHEL6.2下挂载光驱安装软件
查看>>
YYCache 源码分析(二)
查看>>
2016年第9本:系统之美
查看>>
framebuff 显示子系统
查看>>
php手册杂记
查看>>
Yii2 定时任务创建(Console 任务)
查看>>
lombok+slf4j+logback SLF4J和Logback日志框架详解
查看>>
PHP 单例模式继承的实现方式
查看>>
思维杂谈(1)
查看>>
【Java深入研究】3、HashMap源码解析(jdk 1.7)
查看>>
1102 采药 2005年NOIP全国联赛普及组
查看>>
WebSockets Tutorial(教程一)WebSockets简介
查看>>
仿支付宝/微信的password输入框效果GridPasswordView解析
查看>>