我目前正在学习反射,并且我在堆栈上看到了大多数与我的问题类似的帖子,但是,我认为他们没有完全回答我的问题。
我想知道 Eclipse 中是否有一个包,我可以使用反射来迭代包中的类以查找哪个类实现接口(interface)。只有 1 个接口(interface),因此他们要么实现它,要么不实现。
有人可以提供一个基本清晰的例子来说明我如何解决这个问题吗?有些人告诉我这是不可能的,而其他人则说使用反射是可能的。
感谢任何可以帮助解决此问题的人。
最佳答案
Reflection API 不提供直接迭代特定包中的类的工具。一旦你拥有了它,它就专注于发现它。
要实现您想要的目标,必须读取应用程序的类路径,迭代类路径,打开 jar 并进入目录,找到以 *.class
结尾的文件并获取它们作为资源,如 getResource(full_class_name)
或使用 Class.forName()
直接将其作为类获取。
此方法有一个限制:您将看不到自定义类加载器加载的类。
除非这是一个练习,否则我建议您使用 Reflections库可以满足您所需的一切,甚至(可能)更多...:)
更多细节
Java 系统属性“java.class.path”包含应用程序的类路径,在 Windows 上用 ;
分隔,在 Unix 上用 :
分隔。
因此,这是获取类路径元素列表的方法:
System.getProperty("java.class.path").split(File.pathSeparator)
这里有一些代码示例可以帮助您开始:
for (String cpElement : System.getProperty("java.class.path").split(File.pathSeparator)) {
File cpFile = new File(cpElement);
if (!cpFile.exists()) {
continue;
}
if (cpFile.isDirectory()) {
findClassesInDirectory(cpFile);
} else {
findClassesInArchive(cpFile);
}
}
等等,我将把 findClassesInDirectory()
和 findClassesInArchive()
的实现留给您。很好的锻炼。玩得开心。
关于java - 使用反射迭代包中的类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27355727/