繁体   English   中英

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

[英]Method to iterating through classes in a package using Reflection

我目前正在学习反射,并且我已经看到了与我的问题相关的大多数类似文章,但是,我认为他们并没有完全回答我的问题。

我想知道我是否在Eclipse中有一个程序包,我可以使用Reflection来遍历程序包中的类以找到哪个实现接口。 只有1个接口,所以他们要么实现它,要么不实现它。

谁能提供一个基本清晰的例子说明我该怎么做? 有人告诉我这是不可能的,而其他人则说可以使用Reflection。

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

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的guava库。 它们提供了有关反射的有用实用程序。

对于您的特定问题,我将看一下TypeToken和方法getTypes()

祝好运

是的,您可以这样做。 但是,日食更多的是AST树的翻译,而不是反射。 查看是否要遍历源代码,并查看哪个源文件实现了接口,您可能需要AST树遍历器才能执行此操作。 但是另一方面,如果您想在运行时自检给定程序包中的类文件或实现上述接口的文件夹,则需要Reflections来执行。 无论哪种方式都可行。 我无法给您提供代码来尝试一下,因为与Google一起花一点时间就能为您提供所需的答案,尽管并非全部都在同一地点。

反射不能提供全部检查的所有操作。

对于已知的类,可以使用以下方法获取类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)文件系统 ,并像其他任何实际文件系统一样浏览文件夹。

您可能要检查名称中没有$类(嵌入式,生成的匿名类):仅fileName.matches("[^$]+\\\\.class")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM