`

java动态加载指定的类或者jar包反射调用其方法-涉及其他jar中的类就报ClassNotFound问题分析及解决思路

 
阅读更多

在这篇博文中java动态加载指定的类或者jar包反射调用其方法,介绍动态加载指定的类,当时我是拿URLClassLoader介绍的,当然可以自定义一个ClassLoader重写对应的方法, 不过这个有现成的比自己重写更强大为何不用。

话不多说,很久不写博客了,时间太紧了,起因还是一个网友私信我,说他反射创建某个对象时涉及其他jar中的类就会报ClassNotFound异常。

其实,我也遇到过这个问题,在项目中反射创建一个service也是这样的,涉及到第三方的jar可能就出这问题,当时我可是纠结了好久,花了好几天时间去解决,请教过诸多大神和网友,不过还是不行,问题沉溺了有一阵子。

网上很少又提到这个问题的。最近又请教几个有经验的网友说是没有findClass的原因,或是类名或者service的原因,应该是我描述问题没描述清楚吧。而且关键这个jar呀你不反射创建项目中用的好好的,就和昨天晚上私信我的那个网友一样,按JVM的双亲委托模型不应该啊,不熟悉的可以看看这译文个深入分析Java ClassLoader原理,自定义或者URLClassLoader的父加载器是App ClassLoader,而这个jar或者类肯定它会找到并加载或者提前就加载到JVM里呢,怎么回事呢。

其实你如果这样想,我们都犯了一个严重的错误,就是我们不是单纯依托与JVM,程序结束就OK了,可能你测试的时候没问题,已到项目就有这问题。问题在于我们往往是运行在个应用服务器下,一般都是tomcat吧,而tomcat有自己的一套加载机制,有自己一些加载器,我们忽略这个因素才是导致了问题发生的根本原因。

我们忽略了tomcat内部自定义的类加载器只想到了JVM的那几个加载器,tomcat有个叫webApp的加载器它是先加载WEB-INF/classes后在加载WEB-INF/lib,但它的父加载器是它的common加载器,comon的父加载器是system加载器(和JVM的应用程序加载器功能差不多,不过指定了其他tomcat目录下的加载,大家可以看看官网上的英文文档),但是源码中这个加载器是URLClassLoader的子类,而URLClassLoader默认父加载tomcat下是它的system加载器这么设计和tomcat的<Loader delegate="true"/>配置有关,默认为无为false,会直接委托给tomcat的system加载器加载system委托最顶层的Bootstrap加载器(差不多是JVM里起始加载器和扩展加载器的合并),但不管怎么样,项目在tomcat下自定义的或者URLClassLoader加载默认父加载器都不会是tomcat的webApp加载器而是system加载器,或者自定义的加载器或URLClassLoader和tomcat的webApp加载器没有上下关系,所以动态创建类时设计到其他类时肯定会报CNF异常。

解决思路就是先获取当前类的Class,然后获取当前类的加载器,在自定义的加载器或者URLClassLoader加载器创建时指定为它们的父加载器,这样问题就会游刃而解了,可能平常我们测试写个简单的例子没遇到这个问题,因为我们那时的URLClassLoader或者自定义的加载器的父加载器都是JVM的第三次加载器即应用程序加载,它是专门加载classpath下边的或者指定的类或者jar的,依照双亲委托模型,肯定会找到引入路径的那个类或者jar的。

或者我们使用Class.forName()的方式来动态加载指定的类,就不会存在这个问题,因为这种方式一方面是能初始化类的静态东西,再就是重要一点,就是采用的加载当前所在类的加载器来加载你指定的类,这样你在tomcat下那就是它的webApp加载器啊,肯定不再出现这个问题,可能直接就从缓存里找到了。

参考:《深入理解java虚拟机:JVM高级特性与最佳实战第二版》和apache官网文档http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html,以及tomcat7源码。

声明:以上陈述都是基于JDK7,tomcat7。

时间仓促,可能有不妥后者不严谨的地方,忘留言指正,十分感激!

分享到:
评论

相关推荐

    spring-boot-2.3.6.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    scratch少儿编程逻辑思维游戏源码-糖果狩猎 多人游戏.zip

    scratch少儿编程逻辑思维游戏源码-糖果狩猎 多人游戏.zip

    spring-boot-1.1.12.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    scratch少儿编程逻辑思维游戏源码-小船.zip

    scratch少儿编程逻辑思维游戏源码-小船.zip

    【车间调度】基于遗传算法GA求解车间调度优化问题【含Matlab源码 13251期】.zip

    985研究生,Matlab领域优质创作者 (1)如需代码 加腾讯企鹅号,见评论区或私信; (2)代码运行版本 Matlab 2019b (3)其他仿真咨询 1 完整代码包运行+运行有问题可咨询 2 期刊或论文复现; 3 程序定制; 4 期刊写作或指导; 5 科研合作;

    spring-boot-1.4.4.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-1.4.4.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    Java超市管理系统样本.doc

    Java超市管理系统样本

    基于MATLAB的柔性车间调度系统设计与实现:遗传算法优化及甘特图生成

    内容概要:本文介绍了基于MATLAB的柔性车间调度系统的设计与实现。该系统旨在通过遗传算法优化车间调度,以最大化生产效率并最小化生产成本。系统不仅考虑了机器的柔性(即不同类型的机器具有不同的加工能力和成本),还实现了甘特图和收敛曲线的自动生成,便于分析和优化调度结果。主要内容包括:问题描述与需求分析、系统设计(算法选择、机器柔性设计)、系统实现(MATLAB源代码编写、柔性车间调度模型构建)以及实验与分析。 适合人群:从事制造行业、工业工程、自动化控制领域的研究人员和技术人员,尤其是对车间调度优化感兴趣的读者。 使用场景及目标:适用于需要优化生产调度的企业和研究机构,帮助他们提升生产效率、降低成本,并提供可视化的调度结果分析工具。 阅读建议:读者可以通过本文详细了解遗传算法在车间调度中的应用,掌握MATLAB编程技巧,学会利用甘特图和收敛曲线进行调度结果的分析和优化。

    GIS和旅游景点规划视域分析专题培训课件.ppt

    GIS和旅游景点规划视域分析专题培训课件.ppt

    spring-boot-1.4.5.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    NU1680低成本、无固件、高集成度无线充电电源接收器电路图和BOM

    BOM建议直接使用原理图,BOM只供参考 支持QI协议的无线充电接收端芯片 可编程的3.5-9V输出电压 5W BPP 无线功率接收 Rx 极简的电路设计解决方案:1 个线圈+1 片 NU1680 + 12 颗外围器件 无固件烧入,可节省研发和生产时间和资源 去除了同步整流桥上的自举电容,使成本更低 具备 I2C 功能,可通过它配置 FOD 等寄存器参数 小尺寸,16 脚 QFN 封装,3.0mm x 3.0mm,脚间距 0.5mm 原理图和BOM可点绑定资源下载,LC部分电容建议X7R。

    spring-boot-2.2.6.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-1.1.4.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-data-redis-1.4.4.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-2.2.1.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    scratch少儿编程逻辑思维游戏源码-塔防 地精VS怪兽.zip

    scratch少儿编程逻辑思维游戏源码-塔防 地精VS怪兽.zip

    scratch少儿编程逻辑思维游戏源码-塔(3).zip

    scratch少儿编程逻辑思维游戏源码-塔(3).zip

    知识图谱可视化之cytoscape.js构建知识图谱项目源码

    项目主要介绍cytoscape.js的使用方法: 1)构建静态html文件进行图谱展示 2) 使用Python的django框架进行开发,并将后台业务逻辑生成的数据传送到前端js中进行展示,实现动态图谱构建,满足工程实际需要。 动态与静态图谱均整合至项目源码中,使用不同路由即可访问。 注:结合博客(https://blog.csdn.net/liaoningxinmin/article/details/105323281?spm=1001.2014.3001.5502)理解本项目更佳,运行项目前请看readme文件!

    spring-boot-1.4.0.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

Global site tag (gtag.js) - Google Analytics