我目前正在学习反思,我在堆栈上看到了大部分相似的帖子,但我觉得他们没有完全回答我的问题。
我想知道如果我在Eclipse中有一个包,我可以使用Reflection迭代包中的类来查找哪个实现了接口。只有一个界面,所以他们要么实现它,要么不实现它。
有没有人能提供一个基本的明确例子,说明我怎么做?一些人告诉我,这是不可能的,而其他人说可以使用反射。
感谢任何能帮助解决此问题的人。
答案 0 :(得分:2)
Reflection API不直接提供迭代特定包中的类的工具。一旦拥有它,它就集中精力发现课程。
要实现您想要读取应用程序的类路径的内容,请遍历类路径,打开jar并进入目录,查找以*.class
结尾的文件,并将它们作为{{{}之类的资源获取1}}或使用getResource(full_class_name)
直接将其作为类。
此方法有一个限制:您不会看到自定义类加载器加载的类。
除非这是一项练习,否则我建议您使用Reflections库来完成您需要的一切,并且(可能)更多......:)
更多细节
Java系统属性" java.class.path"包含应用程序的类路径,在Windows上用Class.forName()
分隔,在Unix上用;
分隔。
因此,这是获取类路径元素列表的方法:
:
以下是一些可以帮助您开始的代码示例:
System.getProperty("java.class.path").split(File.pathSeparator)
Etc等我准备为您实施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()
。很棒的运动。玩得开心。
答案 1 :(得分:1)
你听说过Java的guava-libraries吗? 它们提供了有关反射的有用工具。
针对您的具体问题,我会查看TypeToken
和方法getTypes()
。
答案 2 :(得分:0)
答案 3 :(得分:0)
反射并不能为全面检查提供所有操作。
对于已知的类,可以使用以下方法获取类SomeClass
的物理URL:
CodeSource codeSource = SomeClass.class.getProtectionDomain().getCodeSource();
if (codeSource == null) {
// Run-time class; URL into the rt.jar.
} else {
URL url = codeSource.getLocation();
// "file:/.... /classes/.../SomeClass.class"
// "jar:file:/... /someJar.jar!/.../SomeClass.class"
}
对于Java运行时类(rt.jar),codeSource将为null。 在jar的URL上,您可以打开(zip) file system,并像任何真实的文件系统一样浏览文件夹。
您可能希望检查名称中没有$
的类(嵌入式,生成的匿名类):仅fileName.matches("[^$]+\\.class")
。