是否可以找到给定包中的所有类或接口?(快速查看例如Package,它似乎没有.)
我想做这样的事情:
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
Run Code Online (Sandbox Code Playgroud)
所以,我想查看我的应用程序的Universe中的所有类,当我找到一个来自Animal的类时,我想创建一个该类型的新对象并将其添加到列表中.这允许我添加功能而无需更新事物列表.我可以避免以下情况:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Run Code Online (Sandbox Code Playgroud)
通过上面的方法,我可以简单地创建一个扩展Animal的新类,它将自动被拾取.
更新:2008年10月16日上午9:00太平洋标准时间:
这个问题引起了很多很好的回应 - 谢谢.从回答和我的研究中,我发现我真正想要做的就是在Java下不可能.有一些方法,比如ddimitrov的ServiceLoader机制可以工作 - 但它们对我想要的东西非常重,我相信我只是将问题从Java代码转移到外部配置文件.
另一种表达我想要的方式:我的Animal类中的静态函数查找并实例化从Animal继承的所有类 - 无需任何进一步的配置/编码.如果我必须配置,我也可以在Animal类中实例化它们.我理解,因为Java程序只是一个松散的.class文件联合体,就像它一样.
有趣的是,在C#中,这似乎相当微不足道.
前段时间,我遇到了一段代码,它使用了一些标准的Java功能来定位实现给定接口的类.我知道函数隐藏在某些非逻辑位置,但它们可以用于其他类,因为包含的名称是隐含的.那时我不需要它,所以我忘了它,但现在我做了,我似乎无法再找到这些功能.这些功能在哪里可以找到?
编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西.
我有这个代码从目录中读取所有文件.
File textFolder = new File("text_directory");
File [] texFiles = textFolder.listFiles( new FileFilter() {
public boolean accept( File file ) {
return file.getName().endsWith(".txt");
}
});
Run Code Online (Sandbox Code Playgroud)
它很棒.它使用目录"text_directory"中以".txt"结尾的所有文件填充数组.
如何在 JAR文件中以类似的方式读取目录的内容?
所以我真正想做的是,列出我的JAR文件中的所有图像,所以我可以加载它们:
ImageIO.read(this.getClass().getResource("CompanyLogo.png"));
Run Code Online (Sandbox Code Playgroud)
(那个是有效的,因为"CompanyLogo"是"硬编码的",但JAR文件中的图像数量可以是10到200个可变长度.)
编辑
所以我想我的主要问题是:如何知道我的主类所在的JAR文件的名称?
当然,我可以使用它来阅读它java.util.Zip.
我的结构是这样的:
他们就像:
my.jar!/Main.class
my.jar!/Aux.class
my.jar!/Other.class
my.jar!/images/image01.png
my.jar!/images/image02a.png
my.jar!/images/imwge034.png
my.jar!/images/imagAe01q.png
my.jar!/META-INF/manifest
Run Code Online (Sandbox Code Playgroud)
现在我可以使用以下命令加载例如"images/image01.png":
ImageIO.read(this.getClass().getResource("images/image01.png));
Run Code Online (Sandbox Code Playgroud)
但只是因为我知道文件名,其余的我必须动态加载它们.
我需要枚举包中的所有类并将它们添加到List中.单个类的非动态版本如下:
List allClasses = new ArrayList();
allClasses.add(String.class);
Run Code Online (Sandbox Code Playgroud)
如何动态地添加包中的所有类及其所有子包?
更新:在阅读了早期答案之后,我试图解决另一个次要问题是绝对正确的,所以让我说明一下.我知道这是可能的,因为其他工具可以做到这一点.在这里查看新问题.
更新:再次阅读本文,我可以看到它是如何被误读的.我想在编译后从文件系统中枚举所有MY PROJECT'S类.
我知道我们可以这样做:
Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf")
Run Code Online (Sandbox Code Playgroud)
读取我们的jar文件中打包的文件.
我已经google了很多,我肯定没有使用正确的条款; 我想要做的是列出可用的资源,如下所示:
Class.class.listResources("/com/yourcompany/yourapp")
Run Code Online (Sandbox Code Playgroud)
这应该返回包内的资源列表 com.yourcompany.yourapp.*
那可能吗?关于如何做到这一点的任何想法,以防它不能像我展示的那样轻松完成?
注意:我知道可以知道罐子的位置,然后打开它并检查其内容以实现它.但是,我不能在我现在工作的环境中这样做.
如何在实现定义接口的类路径中发现运行时的类?
ServiceLoader非常适合(我认为,我还没有使用它),但我需要在Java 1.5中使用它.
我正在寻找一种方法来列出Java中任意包的所有子包.
像这样的东西:
Package basePackage = getPackage("com.mypackage");
for(Package subPackage : basepackage.getSubPackages()){
System.out.println(subPackage.getName());
}
Run Code Online (Sandbox Code Playgroud)
有办法吗?提前致谢.
IDE(让我们说Netbeans)如何做到这一点?

更新:
我正在尝试找到MyBatis的所有mappers包.在我的项目中,所有映射器包都必须命名为"*.mappers".例如:"abmappers"或"abcmappers".问题是我只知道基础包,并且不确定它下面有多少个映射器包.
更新:这是我的代码试图使用反射库来做到这一点:
private Set<String> getPackagesNames() {
Reflections reflections = new Reflections("com.mypackage");
Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);
Set<String> packageNames = new HashSet<>();
for( Iterator<Class<? extends Object>> it = allClasses.iterator(); it.hasNext(); ) {
Class<? extends Object> subClass= it.next();
packageNames.add(subClass.getPackage().getName());
}
return packageNames;
}
Run Code Online (Sandbox Code Playgroud)
不知道为什么这不起作用.这里没有上课....
UPDATE
这是我的代码.有点慢,但在我的情况下表现并不是那么大.我之前从未使用过Spring,所以如果有更好的方法可以做到,请告诉我.谢谢.
private static Set<String> getPackages(String basePackage) throws IOException, ClassNotFoundException {
Set<String> packagesNames = new HashSet<>();
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory …Run Code Online (Sandbox Code Playgroud) 我知道使用反射来获取包中的所有类并不容易,但是我想知道是否有人知道一个好的解决方案/解决方法,特别是对于Android项目?
给定一个包,我需要能够从中检索所有类并使用反射处理它们的注释.
有谁知道这样做的方法?有没有可用的图书馆?
java ×10
reflection ×4
interface ×2
android ×1
classpath ×1
file ×1
getresource ×1
inheritance ×1
jar ×1
java-io ×1
packages ×1
plugins ×1
resources ×1
service ×1
spring ×1