使用Reflection迭代包中的类的方法

时间:2014-12-08 10:17:20

标签: java eclipse reflection packages

我目前正在学习反思,我在堆栈上看到了大部分相似的帖子,但我觉得他们没有完全回答我的问题。

我想知道如果我在Eclipse中有一个包,我可以使用Reflection迭代包中的类来查找哪个实现了接口。只有一个界面,所以他们要么实现它,要么不实现它。

有没有人能提供一个基本的明确例子,说明我怎么做?一些人告诉我,这是不可能的,而其他人说可以使用反射。

感谢任何能帮助解决此问题的人。

4 个答案:

答案 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)

是的,你可以这样。但是eclipse更多的是AST树翻译而不是反射。看看你是否要迭代源代码并查看哪个源文件实现了接口,你可能需要AST树步行器来做到这一点。但另一方面,如果你想在运行时内省给定包中的类文件或实现所述接口的文件夹,那么你需要Reflection来做到这一点。无论哪种方式都可行。我不能给你代码来试试这个,因为有一段时间与谷歌会给你你需要的答案,虽然不是所有在同一个地方。

答案 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")

相关问题