0

你好stackoverflow'ers!我正在尝试列出特定包中接口中的所有类。我遇到了多种解决方案并尝试了以下方法:

使用反射:

AllCommands = new ArrayList<ICommand>();
Reflections reflections = new Reflections(this.getClass().getPackage().getName());
commandClasses = reflections.getSubTypesOf(ICommand.class);
for (Class<? extends ICommand> c :commandClasses){
    AllCommands.add((ICommand)c.newInstance());
}

使用 extcos:

AllCommands = new ArrayList<ICommand>();
ComponentScanner scanner = new ComponentScanner();
scanner.getClasses(new ComponentQuery() {
    @Override
    protected void query() {
        select().
        from(this.getClass().getPackage().getName()).
        andStore(thoseImplementing(ICommand.class).into(commandClasses)).
        returning(none());
    }
});
for (Class<? extends ICommand> c :commandClasses){
    AllCommands.add((ICommand)c.newInstance());
}

在 NetBeans (7.3) 中调试时,这两种解决方案都成功列出了我的所有类,但是当我编译 jar 并执行它时,commandClasses 集合似乎保持为空。我不习惯 java,但我想它必须对类路径做一些事情,并且调试时间从 \target\classes 文件夹而不是 jar 中获取类。

有人可以帮助我解决允许我在 .jar 中列出类的解决方案吗?this.getClass().getPackage().getName() 是否可能只需要更改为指向 jar 的内容?

4

1 回答 1

0

我自己想出来了.. 使用 this.getClass().getPackage().getName() 作为 Packagename 只指向类文件夹中的文件,以引用我需要替换 '.' 的 jar 中的类 至 '/'。还是非常感谢。

于 2013-06-09T20:39:13.697 回答