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

Load all classes in a specific folder without knowing package name - java

我有一个代码可以将所有 类 加载到具有相同包名 ( 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++;
    }

你可以试试这个:

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>

我想到两件事:

  1. 如果你想加载classes,相应的文件夹必须在你的class路径中(你能确保这一点——因为你不知道文件夹的名字吗?)
  2. 如果要加载 class 包 a.b.ClassName 文件必须位于文件夹 a/b/ClassName.class 中(否则加载将失败)

更新

如果你知道文件夹名称,你也知道包名称(这就是窍门)。必须在Java中一一对应。如果 class 在包 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
  }
}

如果单个包结构中只有一个文件,则目录应该只有一个,名称必须对应包名(当然需要"step into the directory" 直到没有进一步的嵌套,即没有子文件夹,最后一个文件夹包含您要加载的实际 class。这样可以提取目录结构,从而提取包名称。

结束更新

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

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