有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

如何将其更改为将所有类加载到带有尊重包的文件夹中(不在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) 个答案

  1. # 1 楼答案

    我想到两件事:

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

    更新

    如果你知道文件夹名,你也知道包名(这就是诀窍)。它必须在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")(这是一个打字错误,应该是\\)[顺便说一句:最好使用File.separator]
    2. 为什么在for循环中有变量i,但实际上使用了classCounter
    3. addedClassName[classCounter] = classFileAdded[classCounter].getAbsolutePath().substring(classFileAdded[classCounter].getAbsolutePath().lastIndexOf("\\")+1);中提取文件名,对吗?为什么不直接使用addedClassName[classCounter] = classFileAdded[classCounter].getName()
  2. # 2 楼答案

    你可以试试这个:

    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>