在不知道包名称的情况下加载特定文件夹中的所有类 - java

时间:2015-07-20 07:15:35

标签: java reflection classloader

我有一个代码,用于加载具有相同包名称(second)的文件夹中的所有类。

如何更改它以加载带有deference包的文件夹中的所有类(不在second中)(我们不知道包名称)

int classCounter = 0;

File folderAdded = new File("..//940424//second");
File [] classFileAdded = folderAdded.listFiles();
String [] addedClassName = new String [classFileAdded.length];
List<Operations> newOp = new ArrayList<Operations>();
Operations newOpTemp = null;

for(int i = 0; classCounter < classFileAdded.length; classCounter++){
    addedClassName [classCounter] = classFileAdded[classCounter].getAbsolutePath().substring(classFileAdded[classCounter].getAbsolutePath().lastIndexOf("\\")+1); 
    addedClassName [classCounter] = addedClassName[classCounter].substring(0,(addedClassName[classCounter].lastIndexOf(".")));
    addedClassName [classCounter] = "second." + addedClassName[classCounter];

    Class addedClass = Class.forName(addedClassName[classCounter]);
    newOpTemp = (Operations)addedClass.newInstance();
        if (newOpTemp instanceof Operations){
            newOp.add( i, newOpTemp);
            i++;
    }

2 个答案:

答案 0 :(得分:2)

我想到了两件事:

  1. 如果你想加载类,相应的文件夹必须在你的类路径中(你可以确保这个吗 - 因为你不知道文件夹的名字?)
  2. 如果要加载包a.b.ClassName的类,则该文件必须位于文件夹a/b/ClassName.class中(否则,加载将失败)
  3. <强>更新

    如果您知道文件夹名称,您也知道包名称(这就是技巧)。它必须在Java中相互对应。如果某个类位于包a.b中,则必须位于文件夹a/b/中。如果您只知道根文件夹,即pathToRootFolder/a/b/,则可以使用

    搜索文件夹
    File root = new File("<rootFolder>");
    File[] files = root.listFiles()
    

    并检查每个文件是否是目录:

    for(File f : files) {
      if(f.isDirectory()) {
        // do processing
      }
    }
    

    如果单个包结构中只有一个文件,则应该只有一个目录,名称​​必须对应于包名称(当然,您需要“进入目录”直到没有进一步的嵌套,即没有子文件夹,这最后一个文件夹包含你想要加载的实际类。这种方式可以提取目录结构,从而提取包名。

    结束更新

    关于您的代码的一些注释:

    1. //为什么new File("..//940424//second")(这是一个错字,应该是\\)[btw:最好使用File.separator]
    2. 为什么你的for-loop中有变量i但实际上使用classCounter ??
    3. addedClassName[classCounter] = classFileAdded[classCounter].getAbsolutePath().substring(classFileAdded[classCounter].getAbsolutePath().lastIndexOf("\\")+1);中提取文件名,对吗?为什么你不只是使用addedClassName[classCounter] = classFileAdded[classCounter].getName()

答案 1 :(得分:0)

你可以试试这个:

Reflections reflections = new Reflections("mysh.im.monitor");
reflections.getSubTypesOf(Monitor.class);

之前,请确保您的文件夹位于类路径中。

maven依赖

<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.9</version>
</dependency>