|
|
1
134
用纯Java扫描类并不容易。 spring框架提供了一个名为 ClassPathScanningCandidateComponentProvider
这种方法还有一个额外的好处,就是使用字节码分析器来查找候选字符,这意味着它将 加载它扫描的所有类。 |
|
|
2
80
除了你所描述的,没有别的办法。想一想,如果不扫描类路径上的每个类,怎么知道哪些类扩展了ClassX?
|
|
|
3
49
存在一个对类路径进行必要扫描和索引的项目,以便您可以访问此信息。。。 Reflections
(免责声明:我没有使用它,但项目的描述似乎完全符合您的需要。) |
|
|
4
13
ClassGraph . (免责声明,我是作者)。ClassGraph支持在运行时或构建时扫描给定类的子类,但也支持更多。ClassGraph可以在内存中为类路径上的所有类或选定包中的类构建整个类图(所有类、注释、方法、方法参数和字段)的抽象表示,并且您可以根据需要查询此类图。类图支持 more classpath specification mechanisms and classloaders 与任何其他扫描仪相比,它还可以无缝地与新的JPMS模块系统配合使用,所以如果您的代码基于ClassGraph,那么您的代码将具有最大的可移植性。 See the API here. |
|
|
6
9
我知道我参加这个聚会晚了几年,但我在试图解决同样的问题时遇到了这个问题。如果您正在编写Eclipse插件(并因此利用其缓存等),则可以通过编程方式使用Eclipse的内部搜索来查找实现接口的类。这是我(非常粗糙)的第一个伤口:
|
|
|
7
9
我几年前就这样做了。实现这一点最可靠的方法(即,使用官方JavaAPI且没有外部依赖)是编写一个自定义doclet,以生成一个可在运行时读取的列表。
为简单起见,我删除了命令行参数解析,并将其写入System.out而不是文件。 |
|
|
8
7
记住其他答案中提到的限制,您也可以使用
openpojo's
|
|
|
9
4
我只是写了一个简单的演示来使用
|
|
|
10
4
根据您的特定需求,在某些情况下,Java的 service loader 这个机制可能会实现你所追求的目标。
这种方法的主要优点是不需要手动扫描整个类路径中的子类——所有发现逻辑都包含在
显然,Java9将解决其中一些缺点(特别是关于子类实例化的缺点)。 一个例子
假设您对查找实现接口的类感兴趣
班级
你要申报班级
|
|
11
3
因此,如果你碰巧想看到所有的子类,因为你想做一个改变,并且想看看它是如何影响子类的行为的,那么记住你看不到的子类。理想情况下,所有非私有方法以及类本身都应该有良好的文档记录;根据本文档进行更改,而不更改方法/非私有字段的语义,并且您的更改应该向后兼容,至少对于遵循超类定义的任何子类。 |
|
12
3
您之所以看到实现与Eclipse之间的差异,是因为您每次都扫描,而Eclipse(和其他工具)只扫描一次(在大多数项目加载期间)并创建索引。下次你要数据时,它不会再扫描,而是查看索引。 |
|
|
13
3
我使用的是一个反射库,它扫描您的类路径以查找所有子类: https://github.com/ronmamo/reflections 这是如何做到的:
|
|
|
14
2
|
|
|
15
1
我需要将此作为一个测试用例来执行,以查看是否已将新类添加到代码中。这就是我所做的
|
|
|
16
1
您可以使用org.reflections库,然后创建反射对象类。使用这个对象,您可以得到给定类的所有子类的列表。 https://www.javadoc.io/doc/org.reflections/reflections/0.9.10/org/reflections/Reflections.html
|
|
|
17
0
如果要加载同一包中给定类的所有子类,可以执行以下操作:
|
|
|
18
0
|