Java遍历jar包所有类-后续

news/2024/7/6 4:39:05 标签: jar, java, Java, JAVA, package, , 所有类

之前,我曾经写过一篇JAVA.html" title=Java>Java遍历所有类,但经过一名网友提醒发现,只能适用于项目src中的,当jar里时就无法遍历jar里的类。就此我针对代码进行了细化,功能得到进一步的完善。

在分享源码之前,先说说我在遍历jar中的类时所遇到的困难。

这是我测试用的jar,结构如下:

无论是在src中还是在jar中,其实根本的思路还是根据给的域名(如:com.wang.vo.request.hotel.test)定位到的资源对象在src中,我们可以把它当做文件File来进行处理,因此在src中是以文件夹的形式来体现的,但在jar中,的含义是有些不同的,我们不能把它当做File来对待(这样你或得到的是jar的File对象)。那么怎么才能获取jar的资源对象呢?

代码如下:

JAVA.html" title=java>java">	public static void main(String[] args) throws Exception {
		String packageName = "com/wang/vo/request/hotel/test";
		URL url = Thread.currentThread().getContextClassLoader().getResource(packageName);
		if (url != null) {
			System.out.println(url.getPath());
		}
	}

但是通过上述代码,运行后却发现url始终为空,尝试过各种获取资源的办法(如getResourceAsStream),均无法解决,我试了试其他的jar(如spring的),却发现相同的代码url却有值。经过我反复的测试和分析发现,问题出现在生成jar的方式上,即所谓jar

一般来说,我们打jar的步骤大致如下:

之后一直默认,然后Finish。这样看似没问题,但问题出现在这一步:

这种默认方式生成的jar中,只含有class文件,而并没有我们大众所知的文件夹目录结构。可能我们大多数人认为com.test.Student类,Student类文件就应该在com文件夹下的test文件夹里,这其实是片面的,是一个误区!

com.test真正的含义是package域名,就好比.net里的命名空间,它只是为了区分、汇总、唯一标识不同的类而提出的概念,跟文件夹目录层次结构是两回事,我们只是习惯上用文件夹目录来展示package而已。但package却不一定非要用过文件夹目录来展示。

我们可以用下面这段代码来进一步说明这个问题

JAVA.html" title=java>java">	public static void main(String[] args) throws Exception {
		// 项目中jar所在物理路径
		String jarName = "E:/Work/stsf_skisok_product/WebRoot/WEB-INF/lib/testpackage.jar";
		JarFile jarFile = new JarFile(jarName);
		Enumeration<JarEntry> entrys = jarFile.entries();
		while (entrys.hasMoreElements()) {
			JarEntry jarEntry = entrys.nextElement();
			System.out.println(jarEntry.getName());
		}				
	}

默认生成的jar,运行结果如下:

META-INF/MANIFEST.MF
com/wang/util/DateStyle.class
com/wang/util/PropertiesUtil$1.class
com/wang/util/PropertiesUtil.class
com/wang/util/Week.class
com/wang/util/DateUtil.class
com/wang/vo/request/hotel/test/PopularCityRequest.class
com/wang/vo/request/hotel/test/EconomicsRequest.class
com/wang/vo/request/hotel/test/HotelProductVouchRequest.class
com/wang/vo/request/hotel/test/QueryOrderListRequest.class
com/wang/vo/request/hotel/test/HotelListQueryRequest.class
com/wang/vo/request/hotel/test/RoomReserveRequest.class
com/wang/vo/request/hotel/test/HotelOneQueryRequest.class
com/wang/vo/request/hotel/test/HotelBrandRequest.class

如果勾选Add directory entries选项生成的jar,运行结果如下:

META-INF/MANIFEST.MF
com/
com/wang/
com/wang/util/
com/wang/util/DateStyle.class
com/wang/util/PropertiesUtil$1.class
com/wang/util/PropertiesUtil.class
com/wang/util/Week.class
com/wang/util/DateUtil.class
com/wang/vo/
com/wang/vo/request/
com/wang/vo/request/hotel/
com/wang/vo/request/hotel/test/
com/wang/vo/request/hotel/test/PopularCityRequest.class
com/wang/vo/request/hotel/test/EconomicsRequest.class
com/wang/vo/request/hotel/test/HotelProductVouchRequest.class
com/wang/vo/request/hotel/test/QueryOrderListRequest.class
com/wang/vo/request/hotel/test/HotelListQueryRequest.class
com/wang/vo/request/hotel/test/RoomReserveRequest.class
com/wang/vo/request/hotel/test/HotelOneQueryRequest.class
com/wang/vo/request/hotel/test/HotelBrandRequest.class

这样也就解释了为何打成jar后用getResource获取资源url总是为空的原因了。

好了,这个问题解决了之后,那么如何利用JAVA.html" title=Java>Java遍历jar所有类的问题也前进了一大步了,我将在下一篇博文中正是分享源码。

 

 

============友情链接============

JAVA.html" title=Java>Java遍历所有类-终续 http://blog.csdn.net/wangpeng047/article/details/8206427

JAVA.html" title=Java>Java遍历所有类 http://blog.csdn.net/wangpeng047/article/details/8124390


http://www.niftyadmin.cn/n/1661376.html

相关文章

LZW数据压缩算法的原理分析

我希望通过本文的介绍&#xff0c;能给那些目前不太了解lzw算法和该算法在gif图像中应用&#xff0c;但渴望了解它的人一些启发和帮助。抛砖引玉而已&#xff0c;更希望园子里面兄弟提出宝贵的意见。1.LZW的全称是什么? Lempel-Ziv-Welch (LZW).2. LZW的简介和压缩原理是什么…

Android网络编程(六):HTTPS

一、简介 HTTPS 是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信&#xff0c;但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的&#xff0c;是提供对网站服务器的身份 认证&#xff0c;保护交换数据的隐私与完整性。若是不了解HTTP&#xff0c;请看…

Java遍历包中所有类-终续

上一篇中&#xff0c;我向大家讲述了遍历jar包时所遇到的困难&#xff0c;本篇将向大家分享最终版代码。 package com.itkt.mtravel.hotel.util;import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.En…

evey的几张鼠绘

evey的几张鼠标绘制的图片:

Android SoundPool插入耳机后依然有外放声音

使用soundPool播放声音&#xff0c;当手机已经接通耳机时&#xff0c;还会有外放声音&#xff0c;是因为在初始化soundpool是用的流类型&#xff08;streamType&#xff09;导致的&#xff0c;有些流类型系统是一定会播放外放的&#xff0c;比如警告类型和响铃类型&#xff1a;…

java日期工具类DateUtil

一名优秀的程序员&#xff0c;不仅需要有着丰富解决问题的方案&#xff0c;还需要的便是代码的沉淀&#xff0c;这不仅有助于自己快速的开发程序&#xff0c;也有利于保证程序的健壮。那如何才能沉淀自己的”代码“呢&#xff1f;从自己编写util开始其实就是一个不错的选择。 …

HTTP响应头信息

/*** 类说明&#xff1a;HTTP响应头信息* * author 作者: LiuJunGuang* version 创建时间&#xff1a;2011-10-29 上午09:11:08*/ public interface ResponseConstant {/*** 指示新的资源的位置*/String LOCATION "Location";/*** 指示服务器的类型*/String SERVER …

Android studio自带虚拟机修改hosts

一、前言 需要需改Android studio自带模拟器的hosts&#xff0c;可通过window的控制台从虚拟机里将hosts文件拉到电脑&#xff0c;在电脑修改后push回虚拟机。 二、启动虚拟机 如果虚拟机已经开了&#xff0c;先关掉&#xff0c;因为通过Android studio开启的虚拟机是默认无…