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的通常作用:
* 在执行非置信代码之前,自动验证数字签名
* 使用用户提供的密码透明地解密代码
* 动态地创建符合用户特定需要的定制化构建类

 

vivado 工程修改芯片型号 vivado工程芯片与实际板子不匹配时,需要修改工程的芯片型号,并对原工程的ip进行同步更新,之后生成新的bit文件,烧录到板子中 阅读详情

相关推荐

在 Ubuntu 22.04 上配置 SonarQube 与 CI/CD 流水线实现自动化代码审查

本文详细介绍了在Ubuntu 22.04系统上配置SonarQube并与CI/CD流水线集成的完整流程,实现自动化代码审查。从环境准备、数据库配置到核心参数调优,再到与Jenkins和GitHub Actions的深度集成,提供了实战技巧和性能优化建议,帮助团队提升代码质量监控效率。

weixin_28829325的博客 258

ClassLoder深入详解

原文地址:http://blog.youkuaiyun.com/gjanyanlig/article/details/6818655 1.类的加载过程   JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)链接又分为三个步骤,如下图所示: 1) 装载:查找并加载类的二进制数据; 2)链接: 验证:确保被加载类的正

时光过客 498

一文搞懂【Linux 搭建 Dread Hunger 服务器】附本体及Docker部署集群方案

看直播发现了五花八门的开服器和版本,一时兴起按官方文档进行了搭建尝试,所以我的版本基于官方Stream2024.01.10更新的版本,也就是停服时的玩法,应该可以根据mod和补丁魔改成更那些开服器一样的版本,本文不做谈论,注重服务器搭建,毕竟8个人不可能在一个局域网里乱象:首先,我看了大量教程视频,一类是开服器的推广,另一类自建的基本采用Windows搭建,我觉得最离谱的是大部分教程都会教你买一台远程Windows虚拟机???

LHmine的博客 3985

ClassLoder

面试题:类加载器的种类,可不可以自己写一个String类 种类: BootStrapClassLoder ExtendClassLoder AppClassLoder 自定义类加载器 不可以自己写,因为java的双亲委派机制只让String类由系统的加载器来加载,不会让自定义类加载器来加载   注解:双亲委派机制 加载一个类,首先交给父类加载器,依次递归,如果父类加载器成功加载,...

weixin_41909817的博客 198

机器学习---xgboost算法

问题上表现的十分顶尖,本节将较详细的介绍XGBoost的算法原理。成和剪枝分别对应了经验风险最小化和结构风险最小化, XGBoost的决策树生成是结构风险最小。式(1.1)称为经验风险最小化,训练得到的模型复杂度较高。出结果, 是模型的输出结果;等式右边第⼀部分是模型的训练误差,第⼆部分是正则化项,这里。其中,F是假设空间,假设空间是在已知属性和属性可能取值的情况下,对所有可能满足目标的情。最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测。的正则化项是K棵树的正则化项相加而来的。

weixin_43961909的博客 1万+

3DGS 2025实战指南:从安装到训练全流程解析

本文提供了3D Gaussian Splatting (3DGS) 从零开始的完整实战指南。详细解析了使用gsplat库进行环境配置、依赖安装(包括pycolmap和fused-ssim)、数据准备与COLMAP处理、核心训练流程及参数调优,并探讨了2025年3DGS在动态场景、可控编辑等领域的最新进展,帮助开发者快速掌握这一前沿3D重建技术。

b3n4m5q6w7的博客 357

ClassLoder类加载机制

是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序由语句在源文件中出现的顺序决定。所以,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。该模型要求除了顶层的启动类加载器外,其它的类加载器都要有自己的父类加载器(注:应该注意到,实例化不是类加载的一个过程,类加载发生在所有实例化操作之前,并且类加载只进行一次,实例化可以进行多次。一个类加载器首先先将请求发送到父类的加载器,只有当父类的加载器无法完成才尝试自己完成。

qq_45475528的博客 729

正交试验实战指南:从PICT工具到混合水平表应用

本文详细介绍了正交试验法在测试设计中的实战应用,从基础概念到PICT工具的高级使用技巧。通过混合水平表设计和工程化实践案例,帮助测试工程师高效解决参数组合爆炸问题,提升测试覆盖率与效率。特别适合兼容性测试和复杂系统验证场景。

weixin_29230865的博客 259

ClassLoder总结

1. 关于javac、java 我们先从熟知的jdk命令javac、java说起。 首先,Android Studio(以下简称AS)创建一个工程,并在默认包名下新建一个HelloWorld的类。 然后打开AS自带的Terminal, 路径切换到HelloWrold.java所在的目录,依次执行javac和java命令: javac命令执行正常,但java命令却报错: 错...

milanac007的专栏 385

基于Simulink与MATLAB的七轴OpenArm机械臂逆运动学仿真与轨迹规划完整指南

本文详细介绍了七自由度OpenArm机械臂在MATLAB/Simulink环境下的运动学仿真与轨迹规划实现方法。首先建立了机械臂的DH参数模型,验证了正运动学计算;随后提出了两种逆运动学求解算法(数值迭代法和臂型角参数化解析法)的MATLAB实现方案;最后在Simulink中搭建了完整的轨迹规划与控制系统。研究解决了七自由度冗余机械臂特有的多解性、奇异性和关节限位约束等核心问题,为OpenArm机械臂的运动控制提供了完整的技术方案和可运行代码实现。

AI的内部世界的博客 681

【七.三维视觉与视频分析】【1.点云处理:PointNet++/PointTransformer】

各位老铁,今天咱们要聊的可不是普通的二维图像处理,而是三维视觉领域最硬核的技术——点云处理。从最早的PointNet到如今的PointTransformer,这场技术进化堪比三维版的"像素革命"。今天咱们就深入解剖两大里程碑:PointNet++和PointTransformer,保证让你看完全文就能在点云领域横着走!想象一下,你抓了把沙子撒在空中,每粒沙子的位置都是三维坐标——这就是点云的典型形态。最后送大家一句话:点云处理就像在三维宇宙中寻找星辰的轨迹,既要望远镜的宏观视野,也要显微镜的细致入微。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 473

Android ClassLoder 基础应用

预备知识: : adb push的使用; : eclipse 导出jar包的过程 : dx命令行的使用; 首先介绍ClassLoader类关系,它本身也是继承Object,然而实际开发中用的比较多的是他的子类,继承关系如下: ClassLoader extends Object java.lang.Object    ↳

刘志保的博客 594

cuMotion 入门教程(一)面向机器人学的GPU加速运动生成技术

NVIDIA cuMotion是一款高性能机器人运动生成库,专注于机械操作任务,利用GPU加速技术提升性能。开发者预览版支持运动学/逆运动学、碰撞感知路径规划、轨迹优化等功能,兼容任意自由度机器人。该库提供C++和Python接口,支持从URDF/XRDF文件加载机器人模型,包含世界建模、碰撞检测等工具。教程详细介绍了安装配置、机器人描述加载、运动学计算、世界建模、逆运动学求解以及轨迹优化等核心功能。cuMotion整合了Lula和cuRobo库的技术优势,将成为Isaac ROS的核心组件,适用于工业机器

2506_90492529的博客 2195

classloder 是谁

所有的classLoader 都是这个 ClassLoader loader = CommonUtil.class.getClassLoader(); sun.misc.Launcher$AppClassLoader@601bb1 http://cache.baiducontent.com/c?m=9d78d513d98206f34fece4690d61c067690bdb226dc...

dickzhu的专栏 171

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ClassLoder类加载器

javac: *.java--->*.class(源代码-->字节码) java: *.class--->机器码 classpath:类加载路径 一、认识ClassLoader package classLoader; public class Test { public static void main(String[] args) { ...

smell201611010513的博客 180

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java的Classloder的lodeClass源码解析

java中Classloder类的lodeClass方法源码解析 1.什么是ClassLoder: 顾名思义就是类加载器,类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。 2.简单介绍介绍下类从出生到入土的过程: java文

July_winds的博客 335

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 类加载机制 ClassLoder

转载自http://blog.youkuaiyun.com/qq924862077/article/details/47962903 原博主版权声明,侵删:http://blog.youkuaiyun.com/qq924862077/纸上得来终觉浅,绝知此事要躬行  –陆游       问渠那得清如许,为有源头活水来  –朱熹 一个类从被加载到内存中开始到卸载出内存为止,它的整个生命周期包括了:加载(loading)、验

edcSam 505

class和classLoder的getResourceAsStream()

Class.getResourceAsStream和ClassLoder.getResourceAsStream 转载自:http://blog.youkuaiyun.com/explorers/archive/2007/08/02/1722740.aspx   这两个方法还是略有区别的, 以前一直不加以区分,直到今天发现要写这样的代码的时候运行错误, 才把这个问题澄清了一下。基本上,两个都可以用...

小孩No乖的专栏 228

classloder文档集合

主流web容器(jetty,tomcat,jboss)的classloader机制对比和相关问题分析 纠结的velocity log那些事(出现Permission denied) Java Exception性能问题

SAN_YUN的专栏 185

Class.forName与ClassLoder

Class clazz = Class.forName(className); 与 ClassLoader cl = Thread.currentThread().getContextClassLoader(); Class clazz = cl.loadClass(className); 是两种载入类的方式。那么这两种方式有什么不同呢?直接看源码来的快。 class.forName(c

裑贬 1957

java 反射 classLoder

虽然已经用了java一年多了,但是总觉得不是很深入,最近又开始重新温故下java的基础知识。 在一次代码复查的讨论会上,大家讨论到了java的反射,说实话,写代码很少用到。只是了解spring等好多框架底层的实现都用到反射。于是乎开始在网上狂搜资料,给自己补补。 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 能够在程序运行时,通过反射知...

iusmile的专栏 154

ClassLoder类装载器

getClass():取得当前对象所属的Class对象  getClassLoader():取得该Class对象的类装载器 类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,在你说的问题哪里,通过它可以得到一个文件的输入流          装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。Java的类装载器专

u010114717的专栏 645

类加载器 - class类加载过程、ClassLoder类加载器及ClassLoder双亲委托机制

类加载大致流程 类加载到JVM流程结构图 加载Mayikt.class的整个流程及jvm结构图; 1. 线程共享的为颜色,线程私有的为颜色; 2. jdk1.8及之后版本方法区改名为元空间; 什么是类加载器 将我们class文件读取到内存中。 读取class文件来源那些 自己写的java源代码 编译成class文件 硬盘读取 通过网络的方式下载class文件 War、Jar 解压之后都是class文件 从数据库中读取class文件 Java动态代理模式 反射/cg...

祁_z 535

Java-类加载-ClassLoder-源码-总结

/ 如果上述步骤找到了类,并且 resolve 标记为 true,则在目标 Class 对象上调用 resolveClass(Class) 方法,进入“连接(Linking)”阶段(详见官方文档)入口类在使用过程中如果使用到其它类,会根据类路径查找类文件并逐一加载。因此, jar 包中的类、及类路径中指定的类并不是一次性全部加载到 JVM 内存,而是使用到时才。// 如果父加载器都加载不到,则调用自身的 findClass 方法查找类。// 如果父加载器不为 null,则委托父加载器去加载类。

Java程序员的知识博客 1359

java classloder初始化变量

a=1; b=0; ①set static variables default values.    a=0;b=0; ②invoke static getInstance function to create a instance; ③invoke construct function and set a++,b++(at the moment ,a=0,b=0); ④at l

bnsji的专栏 297

class, classloder, dex 详解

class与dex文件 什么是class文件 class文件是一种能够被JVM识别,加载并且执行的文件格式。   class文件的作用 class文件的作用是记录一个类文件的所有信息。 例如记住了当前类的引用this、父类super等等。class文件记录的信息往往比java文件多。   class文件的结构 8位字节的二进制流文件 各个数据紧密排列,无间隙,减少了文件体积,加快加载速度 每个...

weixin_34288121的博客 175
上一篇: 标准输出与标准错误输出
下一篇: JNDI的简单理解(转载)
ardimo
博客等级 码龄18年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值