`

classloder

阅读更多
classloader对我来说一直都是很神秘的东东,这两天一直在研究,总算搞清楚了一些概念。现在写出来作为一个纪录。
classloader利用一种叫双亲委派的方法来加载类,也就是先让该classloader的parent来加载。具体的parent关系我就不再废话了。代码如下:
Java代码 复制代码
  1.    protected synchronized Class<?> loadClass(String name, boolean resolve)   
  2. throws ClassNotFoundException   
  3.    {   
  4. // First, check if the class has already been loaded   
  5. Class c = findLoadedClass(name);   
  6. if (c == null) {   
  7.     try {   
  8.     if (parent != null) {   
  9.         c = parent.loadClass(name, false);   
  10.     } else {   
  11.         c = findBootstrapClass0(name);   
  12.     }   
  13.     } catch (ClassNotFoundException e) {   
  14.         // If still not found, then invoke findClass in order   
  15.         // to find the class.   
  16.         c = findClass(name);   
  17.     }   
  18. }   
  19. if (resolve) {   
  20.     resolveClass(c);   
  21. }   
  22. return c;   
  23.    }  
    protected synchronized Class<?> loadClass(String name, boolean resolve)
	throws ClassNotFoundException
    {
	// First, check if the class has already been loaded
	Class c = findLoadedClass(name);
	if (c == null) {
	    try {
		if (parent != null) {
		    c = parent.loadClass(name, false);
		} else {
		    c = findBootstrapClass0(name);
		}
	    } catch (ClassNotFoundException e) {
	        // If still not found, then invoke findClass in order
	        // to find the class.
	        c = findClass(name);
	    }
	}
	if (resolve) {
	    resolveClass(c);
	}
	return c;
    }

当然,虽然加载时候有parent关系,但实际上这些classloader不一定有java语义上的继承关系(或者说不必须)。
另外就是:名字空间的问题,我认为这个名字空间可以认为由两部分构成,一部分是包名,另一部分是classloader对象。也就是说:如果两个类属于同一个包下,但是由不同的classloader加载,那么他们的也不能互访default类型方法、属性。代码如下:
Java代码 复制代码
  1. public class LoaderSample2 {   
  2.     public static void main(String[] args) {   
  3.         try {   
  4.             AutoResolveClassLoader loader = new AutoResolveClassLoader();   
  5. //          ClassLoader loader = LoaderSample2.class.getClassLoader();   
  6.             Class c = loader.loadClassInMyWay("com.cxz.cl.LoaderSample3"true);   
  7. //          Class c = loader.loadClass("com.cxz.cl.LoaderSample3");   
  8.             Object o = c.newInstance();   
  9.             System.out.println(c.getClassLoader() == LoaderSample2.class.getClassLoader());//如果你的classloader仅仅重写了findclass这个会打印true,因此两个类被同一个classloader加载,而不会出现预期结果。所以你需要重写一个loadClassInYourWay方法来加载。   
  10.             Field f = c.getDeclaredField("age");//c.getField("age");   
  11.             int age = f.getInt(o);   
  12.             System.out.println("age is " + age);   
  13.         } catch (Exception e) {   
  14.             e.printStackTrace();   
  15.         }   
  16.     }   
  17. }  
public class LoaderSample2 {
	public static void main(String[] args) {
		try {
			AutoResolveClassLoader loader = new AutoResolveClassLoader();
//			ClassLoader loader = LoaderSample2.class.getClassLoader();
			Class c = loader.loadClassInMyWay("com.cxz.cl.LoaderSample3", true);
//			Class c = loader.loadClass("com.cxz.cl.LoaderSample3");
			Object o = c.newInstance();
			System.out.println(c.getClassLoader() == LoaderSample2.class.getClassLoader());//如果你的classloader仅仅重写了findclass这个会打印true,因此两个类被同一个classloader加载,而不会出现预期结果。所以你需要重写一个loadClassInYourWay方法来加载。
			Field f = c.getDeclaredField("age");//c.getField("age");
			int age = f.getInt(o);
			System.out.println("age is " + age);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

LoaderSample2和LoaderSample3是同一个包下的类,如果由同一个classloader加载,则通过反射获得LoaderSample3.age属性是可行的(该属性的类型时default)如果利用我自己写的一个classloader加载,则由于classloader不同,则不能访问该age属性。

值得注意的是,如果你建立你自己的classloader,javadoc中建议override findclass方法,但是再loadclass的过程中还会采取双亲委派的模式,也就是说,不能把你要加载的class防到classpath中,否则jvm还会利用appclassloader来加载。我就是采用重新写了一个loadClassInMyWay方法,消除双亲委派。具体代码如下:
Java代码 复制代码
  1. public synchronized Class loadClassInMyWay(String name, boolean resolve)   
  2.         throws ClassNotFoundException {   
  3.     // First, check if the class has already been loaded   
  4.     Class c = findLoadedClass(name);   
  5.     if (c == null) {   
  6.         c = this.findClass(name);//该方法由我override   
  7.     }   
  8.     return c;   
  9. }  
	public synchronized Class loadClassInMyWay(String name, boolean resolve)
			throws ClassNotFoundException {
		// First, check if the class has already been loaded
		Class c = findLoadedClass(name);
		if (c == null) {
			c = this.findClass(name);//该方法由我override
		}
		return c;
	}

其中然我很迷惑的一点是:如果我单纯的override方法:loadClass,运行时刻会给我报异常ClassCircularityError不明白为什么~

以下摘自ibm网站,具体网址:https://www6.software.ibm.com/developerworks/cn/education/java/j-classloader/tutorial/j-classloader-2-2.shtml
总结classloader的通常作用:
* 在执行非置信代码之前,自动验证数字签名
* 使用用户提供的密码透明地解密代码
* 动态地创建符合用户特定需要的定制化构建类

 

分享到:
评论

相关推荐

    测试普通Java程序ClassLoader等级关系的Demo程序

    测试普通Java程序ClassLoader等级关系的Demo程序

    javassist3.19GA.jar

    它使你可以在装入ClassLoder之前,方便的查看类的结构。它主要由CtClass,,CtMethod,,以及CtField几个类组成。用以执行和JDK反射API中java.lang.Class,,java.lang.reflect.Method,, java.lang.reflect.Method ....

    classloader简单例子

    NULL 博文链接:https://andilyliao.iteye.com/blog/625682

    eclipse-project-loader:ClassLoder 用于Eclipse项目中资源文件的高效引用

    Eclipse 项目加载器一个用于随时加载 Eclipse 项目资源而无需重新加载项目的 ClassLoader。... Eclipse 将运行时类路径设置为 Maven 项目布局中的target/classes 。但是src/main/resources等资源目录只有在Eclipse项目...

    高级色系PPT11.pptx

    高级色系PPT11.pptx

    node-v7.9.0-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于tensorflow的的cnn卷积神经网络的图像识别分类

    【作品名称】:基于tensorflow的的cnn卷积神经网络的图像识别分类 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    ### 数据分析概念、使用技巧、优缺点的文章

    数据分析是指通过收集、清洗、处理和解释数据,以发现其中的模式、趋势和关联,从而提供决策支持或洞察见解的过程。它在各行各业中都扮演着至关重要的角色,从市场营销到科学研究,从金融领域到医疗保健,都有广泛的应用。

    对微信帐单进行数据分析

    #pip install pandas -i https://mirrors.aliyun.com/pypi/simple #安装pandas处理数据模块 #pip install xlwt -i https://mirrors.aliyun.com/pypi/simple #安装excel模块 #pip install openpyxl #从微信导出对帐帐单 import pandas as pd #引入pandas,重命名为pd,Python3.9.10版本的Pandas无法兼容低版本的xls import numpy as np #导入均值模块 #从第17行读取csv格式的帐单 df = pd.read_csv('微信支付账单(20230101-20230401).csv',header=16) #分析数据 ...... #将分析数据另存为out.xlsx ..... #进行交易进间分析 ...... #统计交易对方 ...... #将结果保存到excel ..... writer.close()

    node-v7.2.0-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    作业.docx

    作业.docx

    DB23∕T 2540-2019 智慧城市建设项目可行性研究报告.pdf

    DB23∕T 2540-2019 智慧城市建设项目可行性研究报告.pdf

    在CentOS系统上安装Docker 步骤

    附件是在CentOS系统上安装Docker 步骤,仅供交流学习使用,无任何商业目的! 在执行这些步骤之前,请确保你的CentOS系统已经更新到最新,并且你了解Docker容器技术的相关概念。如果你在安装过程中遇到任何问题,可以查看Docker的官方文档或搜索相关的错误信息。

    node-v0.12.3-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    蜂群系统链性态网体系化作战矩阵.txt

    蜂群系统链性态网体系化作战矩阵.txt

    高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip

    【资源概览】 高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!

    ### 这是一篇对Qt开发进行了详细概述的文章

    Qt是一套跨平台的C++应用程序开发框架,被广泛应用于开发图形用户界面(GUI)程序、嵌入式系统、移动设备应用等领域。它提供了丰富的类库和工具,使得开发者可以快速构建功能强大、美观易用的应用程序。以下是一个涵盖Qt开发的教程和案例的综合描述。

    高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip

    【资源概览】 高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!

    node-v7.1.0-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于深度神经网络的图像分类任务.zip

    基于深度神经网络的图像分类任务.zip

Global site tag (gtag.js) - Google Analytics