![]() |
1
137
我用 org.reflections :
另一个例子:
|
![]() |
2
33
Java做你想做的事情就是使用 ServiceLoader 机制。 另外,许多人通过在一个众所周知的类路径位置(即/META-INF/services/myplugin.properties)拥有一个文件,然后使用 ClassLoader.getResources() 从所有jar中枚举具有此名称的所有文件。这允许每个jar导出自己的提供程序,并且可以使用class.forname()通过反射来实例化它们。 |
![]() |
3
8
从面向方面的角度来考虑这个问题;您真正想要做的是在运行时知道所有扩展了动物类的类。(我认为这比标题更准确地描述了您的问题;否则,我认为您没有运行时问题。) 因此,我认为您需要创建一个基类(animal)的构造函数,它将当前正在实例化的类的类型添加到静态数组(我自己更喜欢arraylist,但不喜欢它们各自的类型)中。 所以,粗略地说;
当然,您需要在animal上有一个静态构造函数来初始化实例化的DriveClass…我想这会满足你的需求。请注意,这取决于执行路径;如果您有一个从从未被调用的动物派生的dog类,那么您的动物类列表中将不会包含它。 |
![]() |
4
6
不幸的是,这并不完全可能,因为类加载器不会告诉您哪些类是可用的。但是,你可以做这样的事情:
编辑: JordStOK是正确的(在评论中),这只适用于独立的Java应用程序,并且在应用服务器下不工作。 |
![]() |
5
4
你可以使用
ResolverUtil
(
raw source
)来自
Stripes Framework
下面是一个不加载任何类的简单示例:
这也适用于应用服务器,因为它是在应用服务器上设计的; 代码基本上执行以下操作:
|
![]() |
6
2
Java动态地加载类,所以类的类只能是已经加载的类(尚未卸载)。也许您可以使用一个自定义类加载器来做一些事情,该加载器可以检查每个已加载类的父类型。我认为没有一个API来查询加载的类集。 |
![]() |
7
2
用这个
编辑:
|
![]() |
8
2
尝试 ClassGraph . (免责声明,我是作者)。对于给定的示例,类图代码为:
类关系图也可以做得更多。-- check out the API . |
![]() |
9
1
感谢所有回答这个问题的人。 看来这的确是一个难以破解的难题。最后我放弃了,在我的基类中创建了一个静态数组和getter。
看来,Java并不是像C语言那样建立在自我发现能力上的。我想问题是,因为Java应用程序只是在某个目录/jar文件中的.class文件的集合,所以运行库在被引用之前不知道一个类。那时,加载程序加载它——我正在尝试在引用它之前发现它,如果不到文件系统并查看它,这是不可能的。 我总是喜欢能够发现自己的代码,而不必告诉它自己,但遗憾的是,这也行得通。 再次感谢! |
![]() |
10
1
使用 OpenPojo 您可以执行以下操作:
|
![]() |
11
0
这是一个棘手的问题,您需要使用静态分析找出这些信息,它在运行时不容易获得。 基本上,获取应用程序的类路径,扫描可用的类,并读取它所继承的类的字节码信息。请注意,类狗可能不会直接从动物继承,但可能会从宠物继承,而宠物又会从动物继承,所以您需要跟踪这个层次。 |
![]() |
12
0
一种方法是使类使用静态初始值设定项…我不认为这些是遗传的(如果是的话就不起作用了):
它要求您将此代码添加到所有涉及的类中。但是它避免了在某个地方有一个大的丑陋的循环,测试每个班级寻找动物的孩子。 |
![]() |
13
0
我非常优雅地使用包级注释解决了这个问题,然后将该注释作为参数设置为类列表。 Find Java classes implementing an interface 实现只需要创建一个package-info.java,并将magic注释与它们想要支持的类列表放在一起。 |
![]() |
Fernando Chu · 一个变量有多个可能的类?[关闭] 6 月前 |
![]() |
Amaterastis · 基类接受子类和内部子类的模板参数 7 月前 |
![]() |
Rishab Negi · 这个关键字在抽象类中是如何工作的 7 月前 |
![]() |
dEmigOd · 类层次结构中的运算符重载解析 7 月前 |
![]() |
TableTopRug · 如何从Kotlin中的密封类继承? 8 月前 |
![]() |
hasdrubal · 抽象基类函数指针python 11 月前 |
|
Josh · 通过反思访问孩子的财产 1 年前 |