相关疑难解决方法(0)

你能用反射找到包中的所有类吗?

是否可以找到给定包中的所有类或接口?(快速查看例如Package,它似乎没有.)

java reflection packages

504
推荐指数
13
解决办法
36万
查看次数

在运行时,查找扩展基类的Java应用程序中的所有类

我想做这样的事情:

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 reflection inheritance

139
推荐指数
5
解决办法
14万
查看次数

查找实现接口的Java类

前段时间,我遇到了一段代码,它使用了一些标准的Java功能来定位实现给定接口的类.我知道函数隐藏在某些非逻辑位置,但它们可以用于其他类,因为包含的名称是隐含的.那时我不需要它,所以我忘了它,但现在我做了,我似乎无法再找到这些功能.这些功能在哪里可以找到?

编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西.

java interface

122
推荐指数
8
解决办法
17万
查看次数

如何列出JAR文件中的文件?

我有这个代码从目录中读取所有文件.

    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)

但只是因为我知道文件名,其余的我必须动态加载它们.

java jar file getresource java-io

107
推荐指数
9
解决办法
13万
查看次数

70
推荐指数
7
解决办法
5万
查看次数

如何枚举包中的所有类并将它们添加到List?

我需要枚举包中的所有类并将它们添加到List中.单个类的非动态版本如下:

List allClasses = new ArrayList();
allClasses.add(String.class);
Run Code Online (Sandbox Code Playgroud)

如何动态地添加包中的所有类及其所有子包?


更新:在阅读了早期答案之后,我试图解决另一个次要问题是绝对正确的,所以让我说明一下.我知道这是可能的,因为其他工具可以做到这一点.在这里查看新问题.

更新:再次阅读本文,我可以看到它是如何被误读的.我想在编译后从文件系统中枚举所有MY PROJECT'S类.

java

31
推荐指数
2
解决办法
5万
查看次数

如何浏览Java类资源?

我知道我们可以这样做:

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.*

那可能吗?关于如何做到这一点的任何想法,以防它不能像我展示的那样轻松完成?

注意:我知道可以知道罐子的位置,然后打开它并检查其内容以实现它.但是,我不能在我现在工作的环境中这样做.

java resources classpath

16
推荐指数
1
解决办法
1万
查看次数

类似于Java 1.5中的ServiceLoader吗?

如何在实现定义接口的类路径中发现运行时的类?

ServiceLoader非常适合(我认为,我还没有使用它),但我需要在Java 1.5中使用它.

java reflection service plugins

15
推荐指数
2
解决办法
2万
查看次数

列出包的所有子包

我正在寻找一种方法来列出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)

java spring

10
推荐指数
2
解决办法
1万
查看次数

从Android项目中的包中检索类的列表

我知道使用反射来获取包中的所有类并不容易,但是我想知道是否有人知道一个好的解决方案/解决方法,特别是对于Android项目?

给定一个包,我需要能够从中检索所有类并使用反射处理它们的注释.

有谁知道这样做的方法?有没有可用的图书馆?

java reflection android

9
推荐指数
1
解决办法
5700
查看次数