文档章节

关于java classLoader的一些问题

不道归来
 不道归来
发布于 2016/06/18 18:06
字数 509
阅读 21
收藏 0

根据类加载机制自定义的一个类加载器,逻辑大致如下:

  1. 继承ClassLoader 
     
  2. 重写findClass
    @Override
    	protected Class<?> findClass(String name) throws ClassNotFoundException {
    		System.out.println("自定义查找 __find class :" + name);
    		byte[] classData = getClassData(name);//读取自定义的class文件
    		if (classData == null) {
    			throw new ClassNotFoundException();
    		} else {
    			System.out.println("自定义define __define class" + name);
    			return defineClass(name, classData, 0, classData.length);
    		}
    	}

     

  3. 使自定义类加载器支持非双亲委托机制加载class
    	@Override
    	public Class<?> loadClass(String name) throws ClassNotFoundException {
    		// || name.equals("deep.beans.A")
            //deep.beans.A 为自定义的一个接口,此处'name.equals("deep.beans.A")'是为了让接口使用不同的类加载器加载
    		if (name.startsWith("java") || name.equals("deep.beans.A")) {
    			return loadClass(name, false);
    		} else {
    			synchronized (getClassLoadingLock(name)) {
    				// First, check if the class has already been loaded
    				Class<?> c = findLoadedClass(name);
    				if (c == null) {
           //直接查找而不委托父类加载器
    					c = findClass(name);
    					resolveClass(c);
    				}
    				return c;
    			}
    		}
    	}
          //自定义加载方法
    	public Class<?> selfloadClass(String name, boolean isDefaultLoadOrder) throws ClassNotFoundException {
    		if (isDefaultLoadOrder) {
    			System.out.println("启用双亲委派机制 加载 class[" + name + "]");
    			return super.loadClass(name);
    		} else {
    			System.out.println("启用自定义类加载机制加载 class[" + name + "]");
    			return this.loadClass(name);
    		}
    	}

     

以下是我的一些测试,
接口:interface deep.beans.A ,类 :deep.beans.Person extends A,将A 和Person编译成class文件后放到 一个独立的目录下,与当前工作环境中的A 和Person 做对照试验

  1. 使接口A用系统类加载器加载,实现类Person用自定义类加载加载:
    	    Class clazz1 = cloc.selfloadClass("deep.beans.Person", false);//true :使用双亲委派机制,false只使用自定义的findClass方法
    	    System.out.println(Thread.currentThread().getContextClassLoader().getSystemClassLoader());
    		System.out.println(A.class + "  " + A.class.getClassLoader());
    		System.out.println(clazz1.getClassLoader());
    		System.out.println(clazz1.getInterfaces()[0] + "  " + clazz1.getInterfaces()[0].getClassLoader());
    	    A a = (A) clazz1.newInstance();
    		a.s("aaaaaaaaaaaaaaa");
    执行结果:
    sun.misc.Launcher$AppClassLoader@45ee12a7
    interface deep.beans.A  sun.misc.Launcher$AppClassLoader@45ee12a7
    deep.classloader.MyClassLoader@255316f2
    interface deep.beans.A  sun.misc.Launcher$AppClassLoader@45ee12a7
    aaaaaaaaaaaaaaa
    ---------------------------------
    可以看出接口与实现类使用的是不同的类加载器加载的.但是将与接口不同加载器加载的实现类赋值给接口的时候,却是没有问题的,这就让我突然觉得有点奇怪.



     


  2.  

  3.  

  4.  
  5.  

     



 

 

© 著作权归作者所有

下一篇: homebrew
不道归来
粉丝 2
博文 119
码字总数 15736
作品 0
南京
后端工程师
私信 提问
Java Classloader机制解析

做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对Java ClassLoader的机制做一个简要的总结。因为不同的JVM的实现不同,本文所描述的内容均只限于Hotspot Jvm. 本文将会从...

aminqiao
2014/05/09
24K
2
Java中各类ClassLoader加载时资源搜索路径

关于Java如何加载类,可以参考下面这篇文章: http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 这里我们来了解下,各类ClassLoader是从哪些地方去寻找class类文件进行加载的?...

2k10
2015/03/20
71
0
图解classloader加载class的流程及自定义ClassLoader

java应用环境中不同的class分别由不同的ClassLoader负责加载。 一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职: Bootstrap Cl...

zhengguogaun
2013/06/19
462
0
Java中System.loadLibrary() 的执行过程

System.loadLibrary()是我们在使用Java的JNI机制时,会用到的一个非常重要的函数,它的作用即是把实现了我们在Java code中声明的native方法的那个libraryload进来,或者load其他什么动态连接...

WolfCS
2013/05/11
75.9K
5
eclipse下java动态编译时com.sun.tools.javac.Main类加载问题的解决

java.lang.NoClassDefFoundError: com/sun/tools/javac/Main 最近在使用java的动态编译的时候出现的问题,主要是由于在使用类com.sun.tool.javac.Main时,总是出现NoClassDefFoundError的错误,...

Jonee_Leo
2012/06/16
226
0

没有更多内容

加载失败,请刷新页面

加载更多

面向海量数据的极致成本优化-云HBase的一体化冷热分离

前言 随着业务的持续发展,业务数据库存储量会持续增长。通常数据量过亿时,就需要考虑做分库分表,或者选择扩展能力更好的NOSQL/NewSQL数据库,如HBase就可以单表支持PB级数据,足够满足大多...

阿里云官方博客
32分钟前
3
0
最新最全国内外架构开源技术干货资料

大家好,废话不多说,整理了精心收集了各类资源。 声明,如侵犯个人利益,请联系小编,会立即删除相关资料。 领取方式在文末 求转发列表 好了,由于资源太多啦,就不一一列举了。 大家按照下...

泥瓦匠BYSocket
35分钟前
6
0
springmvc jsp访问不了css

在jsp中引入css,一直报404错误,直接访问css,也无法访问 将css文件移出WEB-INF,因为处于安全性考虑,这个目录禁止外部访问。 当引用css时,可以直接用绝对路径${pageContext.request.conte...

沉迷于编程的小菜菜
37分钟前
4
0
android 系统版本 9.1网络请求遇到坑

网络请求异常: E/http: CLEARTEXT communication to plat.xunlinkeji.cn not permitted by network security policy 在res下新建一个xml目录 创建名为network_security_config.xml 文件 ,该......

MrLins
54分钟前
5
0
Istio 1.3 发布,HTTP 遥测不再需要 Mixer

> 原文链接:Istio 1.3 发布,HTTP 遥测不再需要 Mixer Istio 是 Google、IBM 和 Lyft 联合开源的服务网格(Service Mesh)框架,旨在解决大量微服务的发现、连接、管理、监控以及安全等问题...

米开朗基杨
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部