利用java反射在jar包下二级jar包中搜索一类的子类或实现类问题 10C

方法一:对于在开发环境中,在本项目中找出一个类所有的子类或实现类比较简单,即使是多模块项目,只要以项目根目录为起点,遍历所有.java结尾的类的路径,用Class.forName(classPath)得到该类 ,然后class1.isAssignableFrom(class2)就可以判断出class2是否为class1的子类或实现类,将满足条件的类放入set即实现了要求。
方法二:第二种情况就是在jar包中寻找,也只需利用JarFile jarFile = new JarFile(new File(path));然后利用Enumeration jarEntryEnum = jarFile.entries();获取jar内的所有文件,找到以.class结尾的编译文件的路径,同样用Java反射,然后用isAssignableFrom判断是否为子类或实现类,就可以满足需求。
但问题来了,在正式环境中,由于是多模块项目,maven打包成jar包,主模块为main.jar在外层,其他模块将以child.jar的模式存在main.jar的BOOT-INF\lib目录下。这时使用方法二,只能找出最外层的.class文件和所有的child.jar文件,由于子类或实现类在其他模块也有,所以也需要去除child.jar中的所有.class文件,这时就实现不了了……因为child.jar是在main.jar文件内部,这时的path,如果用JarFile jarFile = new JarFile(new File(path))去取,会报错,路径不存在,文件找不到。
有大神解决过类似的问题吗?一起探讨探讨吧

1

1个回答

getClass().getClassLoader().getResourceAsStream(path), 先是读取jar包内部有没有这个path,如果内部没有时,再读取jar包当前目录下的path, 值得注意的是这个需要有一个实例化类,才能getClass,否则是编译不过的
this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 得到的是程序运行所在路径
System.getProperty(“user.dir”); 和 this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath() 是不一样的, System.getProperty(“user.dir”)得到的是用户执行的时候的那个路径,不一定是jar包所在路径

0
Ernest_M
Ernest_M 可能是误解了我的意思,这问题的侧重点不是路径,而是如何读取jar包内二级jar包所包含的所有类。比如:/home/admin/Project/main.jar!/BOOT-INF/lib/child.jar!这就是读取出来的真实路径,在man.jar这个jar包的lib下有个child.jar,如何才读取出所有class文件呢?举个例子,其中之一的class文件是/home/admin/Project/main.jar!/BOOT-INF/lib/child.jar!/com/test/util/ChildClassFoundUtil.class,那么使用Class.forName("com.test.util.ChildClassFoundUtil")就可以反射到这个类的(亲测可以),但是这只是知道路径才能拿,可是如何拿出所有其他的class类?如何遍历得到?这是关键所在
一年多之前 回复
Ernest_M
Ernest_M 首先感谢您的回答。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
在jar包中查找class等文件
主要功能: 1.列出指定路径下的所有Jar包文件 2.搜索分析指定路径下所有jar包中是否存在指定文件。譬方说要在jar包中查询目个**.class文件。用户可以不用打开Jar包,直接输入路径和要查找的文件即可搜索。 3.除了对Jar包进行搜索分析外,还可以对zip包进行分析 4.填写搜索路径是最好不要只填写“E:/”根盘目录,这样在jcreator编译器中可以运行,但是在dos下用java命令提示出错,不知道原因。 5.如出现问题请与我联系qq752304495
查找接口类对应包下的所有类ClassUtil
package com.corejava.model.abstractmodel.util; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util....
idea按jar包分类查看接口实现
idea 默认是会把当前引用的jar所有实现类进行展示,例如:  有时候这样看源码是不太方便的,很多三方jar都实现了相同的接口,此时如果只想查看jdk的实现就比较难区分,可以点击上图中2按钮进行find按包分类展示: 
根据父类获取同一个包(包括子包)下所有子类
声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333 Java语言的三大特性是继承、封装、多态。继承指的是子类通过关键字extends继承父类、或者是implements实现接口。不管是继承父类还是实现接口,子类和父类都是建立了联系。这里提供了一个根据父类的类信息获取同一个包下的所有子类的信息, import java.io.Fi
Java jar包中获取路径
在jar包中获取路径,一般是用于读取资源文件 System.getProperty的方式获取到的是启动路径,比如cd 到 E:/er下执行 存放在 F:/aa目录下的jar包, 获取到的路径就是E:/er 使用new File("")的方式有同样的问题 如果要更准确需要使用 Class对象的getProtectionDomain().getCodeSource().getLocation()...
巧用Reflections库实现包扫描(扫描某个包中某个接口实现、注解等)
许久不更新博客了。最近在做项目时遇到了一个需要扫描某个包中的某个接口的实现类的需求,在网上搜了一下,发现了一些还不错的实现,但是有句话说得好:“不要重复发明轮子。”像这样的需求肯定是有很多现成的解决方案的。在github和stackoverflow上找了之后发现Reflections库可以完美地实现上述需求,现分享给大家。 Reflections库的依赖: Gradle: compile
JAVA反射机制调用类或JAR包
一、基本概念 1、JAVA反射机制:指在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 二、开发环境 Windows+Eclipse(Eclipse Java EE IDE for Web DevelopersVersion: Neon.2 Release (4...
Java 获取jar包中工程下的文件路径的问题
package main; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java...
java 扫描指定包下类(包括jar中的java类)
在很多的实际场景中,我们需要得到某个包名下面所有的类, 包括我们自己在src里写的java类和一些第三方提供的jar包里的类,那么怎么来实现呢? 今天带大家来完成这件事。 src下面的类如何获取: 首先,比较简单的是得到我们自己写的类,我们先来完成这个, 项目的结构图如下: 我故意创建了这么个比较复杂的项目结构,现在我们就来获取com.baibin包下所有的类,并且打印...
Java读取jar包下的文件
问题描述 读取jar包下面的文件,当程序在eclipse里面的时候,classpath下的文件可以读取到,可一旦将程序打成jar包,则文件读取不到 解决方案 //获取InputStream流的时候,使用下面的方式获取,在eclipse工程/jar包下都不会出错 //path里面的值从jar包的根目录下开始写 InputStream is=Test.class.getClassLoader()...
Java jar包查找攻略
这个假期因为学校安排了实训,所以整个暑假都沉浸在“快乐”(强颜欢笑)编程的学习氛围中。学习到了很多新的知识,新的框架,认识了基础扎实并且技术过硬的老师,也算是不幸中的万幸。 老师为我们讲解了许多技术等等,每个技术需要使用的jar包都很多,有的jar包可以在所使用的软件中直接找到,比如说Oracle 10g的jdbc驱动包则可以在安装文件中找到,具体路径为安装盘:\app\Administrat
利用反射动态获取当前工程下的文件路径_并打成jar包
上一篇动态获取java中的文件路径 这一次我把它打包成jar包,方便随时导入使用。 新代码工程目录: 源代码:FilePath.java package filepath; import java.io.File; public class FilePath { //当前的工程下的路径 public static String getProj
史上最完整扫描包下所有类(含Jar包扫描,maven子项目扫描)
要扫描包下的所有类,分类路径下扫描和jar包扫描两种,其中jar包扫描又分项目中引入的三方jar包,同级maven的多个子项目jar相互引用,还有jdk jar包(这里不考虑,一般没哪个项目会扫描jdk jar包里的类).   我先声明一个接口,用于应对不同类型的class扫描: public interface Scan { String CLASS_SUFFIX = ".cl...
Java获取包或jar下面的所有class文件
  import java.io.File; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.*; import java.util.jar.JarEntry; import java.u...
批量反编译jar包中的class文件
在命令行中用jad.exe工具批量反编译jar包中的所有class文件 1.说明如何批量反编译的帮助文档: http://www.udl.es/usuaris/jordim/Progs/Readme.txt 2.下载反编译工具jad.exe文件,将它设置到环境变量path,或者拷到其他已经了环境变量path的地方, 或者在cmd中转到此文件目录下。 简单的方法是
java加载jar包下的资源文件过程及原理分析
最近遇到一个这样的问题,项目是一个spring cloud的项目,一个主模块(记为mainMoudle)依赖了另一个子模块(记为subMoudle)。在开发过程中,在idea开发工具环境下是能正常运行的,但由于测试时,需要将模块打包,就将subMoudle工程打成了一个jar放在mainMoudle下,跑jar包时就发现不能运行了,控制台抛出了fileNotFoundException的异常信息。
读取所有的jar包文件
读取所有的jar包文件
Java反射机制在Spring IOC中的应用
IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 本篇文章主要讲解一下IOC底层实现的原理(反射),就不对IOC的概念进行详述了。 在Spring的配置文件中,经常看到如下配置: 那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!! 下面是Spring通过
java反射在项目中的应用
  Java反射(reflect)是开发过程中一种常用的手段,常常被用在处理一些感觉有共性但看起来又好像没法抽象的功能上.在OECP项目开发当中,我们在很多地方用到了反射,其中对实体类进行了分层抽象封装的过程中就有一些使用.本文将以重写equals方法为例,简单介绍一下java反射的应用.   先大体介绍一下我们的实体封装的结构.从UML图中我们可以看到顶级SuperEO类作为整个实体层次的...
查看类加载器是从哪个包下加载的类
有时候项目庞大,引入不同版本的jar,但是不确定加载器加载的是哪个包里的类,可以使用下面的方式查看 ProtectionDomain pd = JSONObject.class.getProtectionDomain(); CodeSource codeSource = pd.getCodeSource(); System.out.println(codeSource); (file:
java中String在哪个jar包里
首先String类,包括他里面的方法都在java.lang.String这个包里,这个包在rt.jar这里   
再eclipse查看某个java类属于哪个jar包
在eclipse界面直接按ctrl+shift+t,弹出以下界面,属于类名即可
java中jar包内的类访问jar包内部的资源文件路径和获得读取资源文件内容的问题
    在大数据开发和java web开发中,我们有时会在程序中读取一些资源文件的内容。当我们在本地运行调试的时候是没有任何问题的,但是当我们将程序打成jar包上传到集群中后运行时,发现报错:“找不到配置文件的路径”。虽然jar中确实存在配置文件,但是还是读取不到。相关解决方法可以参考以下相关资料: java中jar包内的类访问jar包内部的资源文件的路径问题:http://blog.csdn.n...
Java 读取jar包中的资源文件夹
个人博客原文地址:http://www.ltang.me/2016/07/19/Java-jar-read-resource/ 最近在做一个工具包的时候,有这么一种需求:在运行main函数时,需要将resources资源文件夹下的xml子文件夹中的文件加载。原本可以使用Main.class.getClassLoader().getResoruceAsStream()将文件一一加载,但是xml子文...
Spring中java反射的利用
创建spring容器 package springbaby; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom...
java获取工程目录下面或者引用jar包中的配置文件方式:
1、获取工程目录下面的配置文件:String workspaceDir = RuleFileUtils.class.getResource(File.separator).getPath();2、获取引用jar包中的配置文件:String projectDir = RuleFileUtils.class.getClassLoader().getResource("").getFile();...
Java反射机制在实际开发中的用法
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 一般情况下,如果我们要调用一个对象的方法或者属性,程序员需要先获得这个对象有哪些方法或者属性;反射就是程序员不需要提前知道有哪些属性或者方法,可以由程序自己查询和判断调用哪一个属性或者方法。
JAR包引用其它JAR包的classpath问题
运行jar包的命令: java -jar hello.jar 不过如果工程引用到了其它jar,虽然用ide工具打包时可以看到引用的JAR已经加入到了自己的JAR中,但运行时却会提示ClassNotFoundException。 此时需要修改ide工具自动生成的hello.jar中的MANIFEST.MF,通过MANIFEST.MF中的Class-Path 来指定运行时需要用到的其他jar,其
java反射在jdbc中的应用
通过反射简化jdbc操作数据库
java.util.Map包下各个类的特点汇总
java.util.Map包下各类和接口的特点如下图(包含实现方式,特点,父子关系) 文字版是这样的: Map接口 HashTable 实现:基于拉链法,初始长度11,加载因子0.75,扩展长度2倍+1。 特点: 线程安全(全map锁),支持多线程 key和value都不可以是null 支持Iterator(迭代器)和Enumeration(枚举器)两种方式
浅谈在JAR中同名类冲突问题
楔子 这段时间再给客户部署服务的时候,发现有一个服务在公司通过了所有测试,但是却在客户现场的生产环境上报出了一个诡异的问题。由于对出问题的那段代码不熟悉,所有前后折腾了2个小时才定位出来,原来是服务依赖的两个JAR包中都同时出现了一个同名类(该类的完全限定名一样),并且这两个类中都包含了同一个方法。在公司环境中执行的是正确的那个方法,而在客户现场执行的是错误的方法。这就导致了在公司没有问题的服务...
java泛型和反射在web项目中的应用
public abstract class BaseAction extends ActionSupport implements ModelDriven { // =============== ModelDriven的支持 ================== protected T model; public BaseAction() { try { /...
Linux查找class类所在jar包
1.说明 写代码或者定位问题的时候, 经常发生只知道类名不知道其所在jar包的问题, 在Eclipse中可以使用Ctrl+Shift+T查找类, 但是如果类所在的jar包不在Build Path中, 则是找不到的。 另一种方法是到网上搜索或者专门的网站去查找, 但只能查找公共仓库上的类所在jar包, 如果是自己编写的私有的类就找不到了。 还有的人自己写代码...
如何使用java代码加载指定包下面的所有类
如何加载指定包下面的所有类使用代码来实现加载指定包下面的所有类配置文件config.properties(其位置在resource目录下)page=cn.ishow读取配置文件工具类/** * 读取配置文件工具类 */ public abstract class ReadUtils { private static Map<String,Object> cache = new HashM
利用java反射来查找某个包下的所有类,并得到class取得实例
从包package中获取所有的Class /** * 从包package中获取所有的Class * @param pack * @return */ public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getClasses(String pack) { // 第一个class类的集合 Set&amp;lt;Class&amp;lt;?&amp;gt...
Java 扫描包下所有类(包括jar包)
  package com.MyUtils.file; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URI; import java.net.URISyntaxException; i...
向下转型 -- 父类、抽象类、接口引用指向子类、实现类
只能调用父类、抽象类或抽象类中已经有的方法,才能使用。如果子类中有的方法,在父类中没有,则不能调用格式:父类 对象 = new 子类构造函数();对象.方法();        只能调用子类和父类中共有的方法或接口:接口  对象 = new 实现类构造函数();对象.方法();     只能调用接口和实现类中共有的方法...
读取Jar包中的配置文件
读取Jar包中的配置文件在打包前和打包后有区别:打包前: getClass().getClassLoader().getResourceAsStream(propertiesPath);这样读的InputStream为BufferedInputStream实例,打包后:将以流为sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream实
构建自己的Java Web框架(四)之JAVA反射机制在框架中初步使用
通过上篇文章,我们已经对AVA反射机制有了方方面面的了解,接下来结合前面的几篇内容来进一步实现我们自己的框架。
java.util.Collection包下各个类的特点汇总
java.util.Collection包下各类和接口的特点如下图(包含实现方式,特点,父子关系) 文字版是这样的: java.util.Collection接口 Set接口 特点:没有重复元素,可以有null(最多一个),没有顺序 HashSet 实现:基于HashMap 特点:没有顺序,用equals()和hashCode()协同判断元素是否存在 LinkedH
相关热词 c#串口测试应用程序 c# 匹配 正则表达式 c#防止窗体重绘 c#读写txt文件 c#挖地雷源代码 c#弹框选项 c# 移除 队列 c# 密码写入配置文件 c# 获取可用内存大小 c# 嵌入excel编辑

相似问题