今天遇到一个比较奇怪的问题,MultiPageEditor所使用的类和子Page使用了同一个类,因为我使用的是同一个jar包里的类,两个工程各自使用自己的jar包,但是是一个相同的jar包,这样在运行时,就出现了这个错误:
链接过来一个问题说明:
一下内容转载自:
(转载请说明)
http://www.cnblogs.com/deepnighttwo/archive/2011/08/31/2160990.html
LinkageError包括其子类,是Java中比较不应该出现的Error。出现这些问题,大概有几个问题:ClassLoader没有严格遵守Java中默认的双亲委派模式;全限定名相同的两个类在不同的CL中有重复;程序运行时使用的类的版本与开发时候不一样(类有变化,比如改了方法的可见性等)。
而LinkageError本身则更少见。当遇到LinkageError loader (instance of xxx) previously initiated loading for a different type with name "lib/MyData"时,可以肯定系统中有ClassLoader违背了Parent Delegate的规则。
问题的根源就是,当一个类已经被解析过之后,它用到的其它类也就已经确定并被解析好了。这时候,如果另一个CL也加载了同一个类(类名相同),并尝试将这个类的实例给前面的引用赋值,因为实际上两个类是由不同的类加载器加载的,既在JVM看来是不同的类,所以就会出现这个错误。
下面是一个简单的例子。没有实际意义,只为了展示问题。
系统中的几个角色类:
IFac - 接口,提供一个getMyData方法。
MyData - 数据类,没有实际意义,但是在系统中,这个类的加载则是引发问题的关键
IFacImpl - IFac接口的实现。
系统中还有一个不可或缺的角色——那个不遵守规则的ClassLoader。我们需要自己写一个ClassLoader来违法Parent Delegate的规则。
package webcl;
2
3 import java.net.URL;
4 import java.net.URLClassLoader;
5 import java.net.URLStreamHandlerFactory;
6
7 public class WebAppCL extends URLClassLoader {
8
9 public WebAppCL(URL[] urls, ClassLoader parent,
10 URLStreamHandlerFactory factory) {
11 super(urls, parent, factory);
12 }
13
14 public WebAppCL(URL[] urls, ClassLoader parent) {
15 super(urls, parent);
16 }
17
18 public WebAppCL(URL[] urls) {
19 super(urls);
20 }
21
22 @Override
23 protected synchronized Class<?> loadClass(String name, boolean resolve)
24 throws ClassNotFoundException {
25 try {
26 return findClass(name);
27 } catch (ClassNotFoundException ex) {
28 return super.loadClass(name, resolve);
29 }
30 }
31
32 }
这个ClassLoader唯一的作用就是违反PD的规则。
然后是App程序:
package test;
2
3 import java.net.URL;
4
5 import lib.IFac;
6 import lib.MyData;
7 import webcl.WebAppCL;
8 public class App2 { // 应用程序的classpath上有IFac类和MyData类。
9 public static void main(String[] args) throws Exception {
10 MyData resolved = new MyData();
11 WebAppCL cl = new WebAppCL(new URL[] {
12 new URL("file:\\C:\\Users\\zangmeng\\Desktop\\data.jar"), // 包含MyData类
13 new URL("file:\\C:\\Users\\zangmeng\\Desktop\\faclib.jar") }); // 包含FacImpl类,不包含IFac类。
14 IFac fac = (IFac) cl.loadClass("faclib.FacImpl").newInstance();
15 MyData data = fac.getData();
16 }
17 }
程序在运行时,类加载情况如下所示:

程序很简单,四行代码而已。
第一行是创建一个MyData的实例。目的是让MyData类被加载和解析。
第二行是创建一个WebAppCL,这个不听话的CL会优先加载自己classpath下的类,如果失败了再去问parent cl要。现在这个CL可以加载MyData类和FacImpl类。
第三行,首先是IFac fac这段。JVM需要使用当前类加载器,也就是AppClassLoader,加载并解析IFac类,解析的过程中,同时链接到AppCL加载的MyData类。等号的另一边,通过WebCl加载并创建一个FacImpl的实例。这个时候,因为WebAppCL会首先从自己的CP里加载类,所以在解析FacImpl的时候,加载MyData的请求并没有被委派到AppCL,而是自己自己消化了,这时候JVM里面就有两个MyData类了。但是程序到这里并没有错误,因为WebAppCL里面并没有IFac接口,这个接口还是AppCL的,但是这时候隐患已经埋下了——
FacImpl类在解析的时候,需要MyData类,而这个MyData类是被WebCL加载的。
IFac则不同,它的MyData类是被AppCL加载的。
FacImpl实现了IFac接口,按说getMyData方法应该返回相同的类型。而在runti的时候,这两个MyData却是不同的类型,因为它们是被不同的CL加载的。
第四行是引起错误的地方。等号左边的MyData实际上是第一行中那个被AppCL加载的类的一个引用。等号右边返回的MyData实例是被WebCL加载的MyData的实例。两个不同的类型,赋值自然会引发错误。
分享到:
相关推荐
23. **链接错误:LinkageError** - 类的依赖关系发生变化导致的错误,如类加载器问题。 24. **未找到类定义错误:NoClassDefFoundError** - Java虚拟机找不到类定义时抛出。 25. **域不存在错误:NoSuchFieldError...
- **`LinkageError`**:链接错误,通常是由于类加载问题导致。 - **`NoClassDefFoundError`**:类定义在编译时存在但运行时找不到时抛出。 - **`NoSuchFieldError`**:找不到指定字段时抛出。 - **`...
- **示例**:类加载失败。 ##### 13. **域不存在错误**:`NoSuchFieldError` - **定义**:当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。 - **示例**:尝试访问不存在的字段...
美团技术干货
《DeepSeek从入门到精通》是清华大学推出的一套深度学习学习资源,内容涵盖基础知识、实用技巧和前沿应用,适合不同水平的学习者。通过系统化的学习路径,帮助你在深度学习领域快速成长。无论你是初学者还是
下载神器迅雷的发展历史.md
基于Simulink模型与Matlab模型的电压电流双闭环三相PWM整流器与逆变器系统研究:内含dq坐标系解耦与800V直流母线380V输出线电压应用,基于Simulink模型与Matlab模型的电压电流双闭环三相PWM整流器与逆变器系统,Simulink模型,Matlab模型 三相PWM整流器+三相逆变器 内含坐标变,dq坐标系解耦,电压电流双闭环直流母线800V。 逆变器输出线电压380V。 ,Simulink模型; Matlab模型; 三相PWM整流器; 三相逆变器; 坐标变换; dq坐标系解耦; 电压电流双闭环控制; 直流母线800V; 逆变器输出线电压380V,Matlab三相PWM整流逆变系统建模
PROGPPCNEXUS读写烧录软件,全面支持飞思卡尔MPC系列无次数限制快速刷写,PROGPPCNEXUS读写烧录软件,针对飞思卡尔MPC系列处理器的高效刷写工具,无次数限制,PROGPPCNEXUS读写烧录刷写软件 飞思卡尔MPC55xx 56xx 57xx 58xx 没有次数限制 ,PROGPPCNEXUS; 读写; 烧录; 刷写软件; 飞思卡尔; MPC55xx; 56xx; 57xx; 58xx,飞思卡尔MPC系列读写刷写软件:PROGPPCNEXUS
内容概要:本文提出了一种新的黑盒攻击方法——Monte Carlo梯度符号攻击(MGSA),用于针对端到端自动语音识别(ASR)系统的音频对抗样本生成。通过对主导梯度现象的研究和利用蒙特卡罗树搜索有效元素,减少了生成对抗样本所需的查询次数并提高了样本隐蔽性和成功率。实验结果显示,相比现有方法,MGSA能显著减少平均查询次数(约27%)并在多个数据集上实现了极高的攻击成功率(98%-99%)。此外,引入了鲁棒性训练来增强对抗样本的稳定性,在噪声和时移扰动下表现出更好的性能。 适合人群:对自动语音识别系统安全有研究兴趣的研究者,从事机器学习与网络安全领域的研究人员。 使用场景及目标:该方法可用于评估和提高自动化语音识别系统安全性;为构建更强的安全防御机制提供测试工具和技术支持。此外,也为理解和应对深度学习系统的脆弱性提供了新视角。 其他说明:本文不仅探讨了MGSA的基本理论和技术细节,还详细报告了一系列验证其有效性以及与其他现有攻击方法比较性能优势的实验结果。同时,作者提出了两个未来工作的方向,即探索决策级黑盒攻击以克服商业ASR仅提供解码结果的问题,并改进对物理世界中‘空中’条件的适应性
WPF组合控件的赋值案例
直流电机双闭环调速系统Matlab Simulink模型:内外环PI调节器精细仿真与性能优化分析,直流电机双闭环调速系统Matlab Simulink仿真模型:内外环PI调节器优化配置与完美仿真波形的实现,直流电机双闭环调速系统仿真模型 转速电流双闭环调速系统Matlab Simulink仿真模型。 内外环均采用PI调节器,本模型具体直流电机模块、三相电源、同步6脉冲触发器、双闭环、负载、示波器模块搭建。 所有参数都已经调试好了,仿真波形完美,可以直接运行出波形。 可以按照你的Matlab版本转,确保无论哪个版本的软件都可以打开运行。 另外附赠一个13页的说明文档,包含PI参数计算、仿真波形分析、原理分析等内容齐全。 ,直流电机; 双闭环调速系统; Matlab Simulink仿真模型; PI调节器; 参数调试; 仿真波形; 版本转换; 说明文档。,直流电机双闭环调速系统Matlab Simulink模型仿真完美版
激光熔覆技术及其仿真研究:深入探讨COMSOL模拟下的熔池行为与热流耦合效应,激光熔覆仿真研究:Comsol模拟下的熔池流动传热耦合与激光增材制造的潜热效应分析,激光熔覆 comsol模拟 熔池 激光增材制造 仿真 激光熔覆同步送粉,熔池流动传热耦合,考虑潜热,包含粘性耗散和布辛涅斯克近似。 ,激光熔覆; comsol模拟; 熔池; 激光增材制造; 同步送粉; 传热耦合; 潜热; 粘性耗散; 布辛涅斯克近似,激光熔覆仿真:同步送粉与熔池流动传热耦合研究
基于粒子群算法的分布式电源选址定容研究:以IEEE33节点系统为例的优化设计,基于粒子群算法的分布式电源选址定容研究:以IEEE33节点系统为例的优化设计,粒子群算法,分布式电源选址定容。 以IEEE33节点系统为算例,对分布式电源最佳接入位置及接入容量进行选取,以电压越限惩罚和网损为目标,利用粒子群算法进行优化设计,得到最佳接入位置和接入容量,完成选址定容。 最终可得到最优接入位置及定容具体数据,接入前后电压幅值和相角对比图,迭代次数收敛图。 ,核心关键词:粒子群算法; 分布式电源; 选址定容; IEEE33节点系统; 电压越限惩罚; 网损优化; 接入位置; 接入容量; 对比图; 迭代次数收敛图,粒子群算法优化分布式电源选址定容——IEEE33节点系统案例研究
基于COMSOL模拟的透反射相位计算与GH位移分析:光子晶体超表面的研究,透反射相位计算与COMSOL光子晶体超表面模拟研究,透反射相位(GH位移)的计算 COMSOL光子晶体超表面模拟 ,核心关键词:透反射相位计算; GH位移; COMSOL; 光子晶体超表面模拟;,基于COMSOL模拟的透反射相位计算与GH位移在光子晶体超表面的应用
物流仓储系统:西门子S7-1200 PLC控制下的堆垛机与输送线自动化管理程序集成,触摸屏操作界面与博途V15.1编程实现智能化管理。基于算法优化与通信技术,实现高效精准物流运作。,基于西门子S7-1200 PLC的物流仓储堆垛机自动化程序系统:集成触摸屏、激光测距与运动控制算法的一体化解决方案。,堆垛机西门子PLC程序+输送线程序+触摸屏程序。 物流仓储。 涵盖通信,算法,运动控制,屏幕程序,可电脑仿真测试。 实际项目完整程序。 西门子S7-1200+G120+劳易测激光测距 博途V15.1编程 采用SCL高级编程语言。 无加密。 物流仓储是一个涉及到供应链管理和仓库操作的领域。它涵盖了从物进入仓库到出库的整个过程,包括物的存储、分拣、装载和运输等环节。在物流仓储系统中,堆垛机是一种自动化设备,用于将物从一个位置移动到另一个位置。西门子PLC程序、输送线程序和触摸屏程序是为了控制和监控堆垛机的运行而设计的。通信技术在物流仓储系统中起到了连接各个设备和系统的作用,使它们能够相互传递信息。算法则用于优化物的存储和分拣过程,提高物流效率。运动控制技术用于控制堆垛机的运动轨迹和速度,
2011年全国大学生数学建模题测定土壤中污染物浓度.doc
【Matlab】VIP资源2222
永磁同步电机PMSM无感foc驱动代码,高频注入启动,平滑切入观测器高速控制,手写开源可移植至各类MCU,附仿真模型,永磁同步电机PMSM无感FOC驱动代码:高频注入启动,平滑切入观测器高速控制,手写开源,可移植至各类MCU,附仿真模型,永磁同步电机pmsm无感foc驱动代码,启动为高频注入,平滑切入观测器高速控制,代码全部手写开源,可以移植到各类mcu上。 附赠高频注入仿真模型 ,核心关键词:永磁同步电机; PMSM; 无感FOC驱动代码; 高频注入; 启动; 观测器; 高速控制; 手写开源; 移植MCU; 仿真模型。,基于PMSM的高频注入与FOC控制开源代码,可平滑切换观测器,MCU兼容性强,支持高频注入仿真模型。
电力系统可靠性评估:自适应重要抽样法优化下的状态概率分布与风险指标收敛研究,自适应重要抽样法在电力系统可靠性评估中的应用:以减小方差,优化EDNS与LOLP指标,电力系统可靠性评估-自适应重要抽样法 自适应重要抽样方法是在可靠性指标不变的情况下,以减小抽样方差为目标,根据元件的故障概率特性,不断修正分段常数概率密度函数,逼近元件状态的最优概率分布。 可靠性指标采用电力不足期望(EDNS)和电力不足概率(LOLP),以EDNS的方差系数 作为收敛条件,重要抽样函数的更新周期B=2000 ,元件抽样密度初值为 fij=1。 算例采用IEEERTS-79经典算例,下图为EDNS指标收敛曲线和方差系数收敛曲线。 需要常规蒙特卡洛模拟方法的可靠性评估程序、计及新能源接入电力的系统的风险评估或运行风险评估、采用失负荷风险、线路越限风险和电压越限风险指标的运行风险评估均可加好友修改。 ,关键词:电力系统可靠性评估; 自适应重要抽样法; 抽样方差; 电力不足期望(EDNS); 电力不足概率(LOLP); 蒙特卡洛模拟; 新能源接入电力系统; 风险评估; 失负荷风险; 线路越
Launch4j是一款开源工具,可将Java应用程序的JAR包封装为Windows原生可执行文件(.exe),解决用户端无JRE环境时的运行问题。