当前位置: 首页 > news >正文

Java 反射解析指定jar包出现ClassNotFoundException异常,处理方式

在上篇博文中写道,通过Java的反射机制解析了指定的jar包,得到了其中的全类名,方法名,参数名,但是也许有的博友在使用时应该会发现存在一点问题。问题就是在解析简单的接口案例时可以完整的解析,但是如果解析复杂的jar包时出现ClassNotFoundException的异常。那么何为复杂的Jar包?我们平时写的小DOme,基本上依赖就JDK的jar包就可实现,但是当我们项目中引入其他的依赖jar包时,那么在利用之前写的方法通过反射去解析时,就会出现ClassNotFoundException的异常。这篇文章我们就重点来解决该问题。

我们还是以一个简单的案例来演示一下!

例如:我们要解析:HZM-payment-api-1.1.1021.jar 这个复杂的jar包。

       我们知道这个jar包依赖的jar包有:activation-1.1.jar,aliyun-java-sdk-core-3.0.0.jar,aliyun-java-sdk-dm-3.0.0-rc1.jar,commons-codec-1.6.jar,commons-io-2.1.jar。。。。的一系类jar包。

   我们接下来要做的就是将这些jar包 添加到 URLClassLoader 中构建去运行环境,这样就不会出现异常了。具体代码如下:

public class jarTest {
	
	 public static void getJarName(String jarFile) throws Exception {  
		  
	        try{  
	            //通过将给定路径名字符串转换为抽象路径名来创建一个新File实例  
	            File f = new File(jarFile);  
	            URL url1 = f.toURI().toURL();
	            
	            File f1 = new File("F:\\lib\\lib\\activation-1.1.jar");  
	            URL url2 = f1.toURI().toURL();
	            	            
	            File f2 = new File("F:\\lib\\lib\\aliyun-java-sdk-core-3.0.0.jar");  
	            URL url3 = f2.toURI().toURL();
	            
	            File f3 = new File("F:\\lib\\lib\\aliyun-java-sdk-dm-3.0.0-rc1.jar");  
	            URL url4 = f3.toURI().toURL();
	            	            
	            File f4 = new File("F:\\lib\\lib\\commons-codec-1.6.jar");  
	            URL url5 = f4.toURI().toURL();
	            
	            File f5 = new File("F:\\lib\\lib\\commons-io-2.1.jar");  
	            URL url6 = f5.toURI().toURL();
	            
	            File f6 = new File("F:\\lib\\lib\\commons-lang3-3.1.jar");  
	            URL url7 = f6.toURI().toURL();
	            
	            File f7 = new File("F:\\lib\\lib\\commons-logging-1.1.1.jar");  
	            URL url8 = f7.toURI().toURL();
	            
	            File f8 = new File("F:\\lib\\lib\\ELP-common-branch-1.95.jar");  
	            URL url9 = f8.toURI().toURL();
	            
	            File f9 = new File("F:\\lib\\lib\\fastjson-1.1.43.jar");  
	            URL url10 = f9.toURI().toURL();
	            
	            File f10 = new File("F:\\lib\\lib\\httpclient-4.2.1.jar");  
	            URL url11 = f10.toURI().toURL();
	            
	            File f11 = new File("F:\\lib\\lib\\httpcore-4.2.1.jar");  
	            URL url12 = f11.toURI().toURL();
	            
	            File f12 = new File("F:\\lib\\lib\\jaxrs-api-3.0.7.Final.jar");  
	            URL url13 = f12.toURI().toURL();
	            
	            File f13 = new File("F:\\lib\\lib\\jboss-annotations-api_1.1_spec-1.0.1.Final.jar");  
	            URL url14 = f13.toURI().toURL();
	            
	            File f14 = new File("F:\\lib\\lib\\jcip-annotations-1.0.jar");  
	            URL url15 = f14.toURI().toURL();
	            
	            File f15 = new File("F:\\lib\\lib\\jcl-over-slf4j-1.7.10.jar");  
	            URL url16 = f15.toURI().toURL();
	            
	            File f16 = new File("F:\\lib\\lib\\log4j-over-slf4j-1.7.10.jar");  
	            URL url17 = f16.toURI().toURL();
	            
	            File f17 = new File("F:\\lib\\lib\\logback-classic-1.1.2.jar");  
	            URL url18 = f17.toURI().toURL();
	            
	            File f18 = new File("F:\\lib\\lib\\resteasy-jaxrs-3.0.7.Final.jar");  
	            URL url19 = f18.toURI().toURL();
	            
	            File f19 = new File("F:\\lib\\lib\\slf4j-api-1.7.10.jar");  
	            URL url20 = f19.toURI().toURL();
	            
	            File f20 = new File("F:\\lib\\lib\\taobao-sdk-java-auto-20160607.jar");  
	            URL url21 = f20.toURI().toURL();
	            
	            File f21 = new File("F:\\lib\\lib\\HZM-common-1.0.jar");  
	            URL url22 = f21.toURI().toURL();
	            
	            URLClassLoader myClassLoader = new URLClassLoader(new URL[]{url1,url2,url3,url4,
	            		url5,url6,url7,url8,url9,url10,url11,url12,url13,url4,url15,url16,url17,
	            		url18,url19,url20,url21,url22},Thread.currentThread().getContextClassLoader());  
	              
	            	            	            
	            //通过jarFile和JarEntry得到所有的类  
	            JarFile jar = new JarFile(jarFile);  
	            System.out.println("解析的文件名为:"+jarFile);
	            //返回zip文件条目的枚举  
	            Enumeration<JarEntry> enumFiles = jar.entries();  
	            JarEntry entry;  
	              
	            //测试此枚举是否包含更多的元素  
	            while(enumFiles.hasMoreElements()){  
	                entry = (JarEntry)enumFiles.nextElement();  
	                if(entry.getName().indexOf("META-INF")<0){  
	                    String classFullName = entry.getName();  
	                    if(!classFullName.endsWith(".class")){  
	                        classFullName = classFullName.substring(0,classFullName.length()-1);  
	                    } else{  
	                        //去掉后缀.class  
	                        String className = classFullName.substring(0,classFullName.length()-6).replace("/", ".");  
	                       Class<?> myclass = myClassLoader.loadClass(className); 
	                      // Class<?> myclass=myClassLoader.findClass(className);
                           //判断是否为接口  只解析接口
	                        boolean  isInterface =myclass.isInterface();

	                        if(isInterface){
	                        //打印类名  
	                        System.out.println("*****************************");
	                        System.out.println("全类名:" + className);  	                     	                	                       
	                        System.out.println(isInterface);
	                        	                       	                      	                        
	                        //得到类中包含的属性  	                      
	                        Method[] methods = myclass.getMethods();
	            	        for (Method method : methods) {
	            	            String methodName = method.getName();
	            	            System.out.println("方法名称:" + methodName);
	            	            Class<?>[] parameterTypes = method.getParameterTypes();
	            	            for (Class<?> clas : parameterTypes) {
	            	               // String parameterName = clas.getName();
	            	            	String parameterName = clas.getSimpleName();
	            	                System.out.println("参数类型:" + parameterName);
	            	            }
	            	            System.out.println("==========================");	                        	                        
	                         }
	                        }
	                    } 
	                }  
	            }         
	        } catch(IOException e){  
	            e.printStackTrace();  
	        }  
	    }  
	      
	      
	      
	  
	  
	    public static void main(String[] args) throws Exception {  
	        //jar包所在路径  
	  
	        getJarName("F:\\lib\\lib\\HZM-payment-api-1.1.1021.jar"); 
	    }  
	
}

  可能会有很多博友会觉得手动添加jar包会很麻烦。接下来我将写一篇通过文件上传来上传jar包,避免手动输入繁琐

转载于:https://www.cnblogs.com/huangzhimin/p/6644071.html

相关文章:

  • 通过Adobe Encode CC 2017,将一张静态图生成一个长时间的视频。
  • centos7-msyql-慢查询优化
  • centos7-mysql-分表
  • python初学之魔法方法1
  • 50G存储-免费代码托管工具公测上线
  • 学习LaTex
  • Linux 打印 颜色显示
  • java 集合框架(四)Set
  • 数据库分库分表(sharding)系列(四) 多数据源的事务处理
  • NSTimer+倒计时功能实现
  • 轮播1-animate-匀速
  • PhantomJS 安装
  • 翻转式用户登录注册界面设计
  • Web应用防护系统OpenWAF开源CC防护模块
  • python运算符优先级
  • canvas 高仿 Apple Watch 表盘
  • codis proxy处理流程
  • css布局,左右固定中间自适应实现
  • ES6语法详解(一)
  • Intervention/image 图片处理扩展包的安装和使用
  • Javascript编码规范
  • maven工程打包jar以及java jar命令的classpath使用
  • ng6--错误信息小结(持续更新)
  • php的插入排序,通过双层for循环
  • Twitter赢在开放,三年创造奇迹
  • Wamp集成环境 添加PHP的新版本
  • windows下使用nginx调试简介
  • 你不可错过的前端面试题(一)
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 配置 PM2 实现代码自动发布
  • 小程序01:wepy框架整合iview webapp UI
  • 怎样选择前端框架
  • # 数据结构
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (07)Hive——窗口函数详解
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (floyd+补集) poj 3275
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (转)ObjectiveC 深浅拷贝学习
  • (转)ORM
  • (转)用.Net的File控件上传文件的解决方案
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .apk文件,IIS不支持下载解决
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core使用ef 6
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .Net多线程总结