Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不知道包名的情况下加载特定文件夹中的所有类-java_Java_Reflection_Classloader - Fatal编程技术网

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

在不知道包名的情况下加载特定文件夹中的所有类-java,java,reflection,classloader,Java,Reflection,Classloader,我有一个代码,可以用相同的包名(second)加载文件夹中的所有类 如何将其更改为将所有类加载到一个带有deference包的文件夹中(不在第二个)(并且我们不知道包名) int类计数器=0; File folderAdded=新文件(“../940424//second”); File[]classFileAdded=folderAdded.listFiles(); String[]addedClassName=新字符串[classFileAdded.length]; List newOp=n

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

如何将其更改为将所有类加载到一个带有deference包的文件夹中(不在
第二个
)(并且我们不知道包名)

int类计数器=0;
File folderAdded=新文件(“../940424//second”);
File[]classFileAdded=folderAdded.listFiles();
String[]addedClassName=新字符串[classFileAdded.length];
List newOp=newarraylist();
操作newOpTemp=null;
对于(int i=0;classCounter
您可以尝试以下方法:

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>

组织反思
反思
0.9.9

我想到两件事:

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

    如果你知道文件夹名称,你也知道包名称(这是诀窍)。它在Java中必须相互对应。如果类在包
    a.b
    中,它必须在文件夹
    a/b/
    中。如果你只知道根文件夹,即
    pathtrootfolder/a/b/
    ,你可以使用

    File root = new File("<rootFolder>");
    File[] files = root.listFiles()
    
    如果单个包结构中只有一个文件,那么应该只有一个目录,并且名称必须与包名称相对应(当然,您需要“进入目录”直到没有进一步的嵌套,即没有子文件夹,并且最后一个文件夹包含要加载的实际类。这样可以提取目录结构,从而提取包名

    结束更新

    关于代码的一些附带说明:

  • 为什么
    /
    新文件中(“..//940424//second”)
    (这是一个打字错误,应该是
    \
    )[顺便说一句:最好使用
    文件.separator
    ]
  • 为什么在for循环中有变量
    i
    ,但实际使用的却是
    classCounter
  • addedClassName[classCounter]=classFileAdded[classCounter].getAbsolutePath().substring(classFileAdded[classCounter].getAbsolutePath().lastIndexOf(“\\”)+1);
    中提取文件名,对吗?为什么不直接使用
    addedClassName[classCounter]=classFileAdded[classCounter].getName()

  • 你不需要知道这个包,只需要给它一个父文件夹,然后你就可以递归地遍历这些文件夹,并过滤所有文件名中包含java的文件。因此,当我们在不同的包中有一些类时(不是
    second
    ),你就会得到我尝试过的所有文件。在运行时发生异常(
    NoClassDefFoundError:second/ClassInThirdPackage(错误名称:third/ClassInThirdPackage)
    )!问题不在于文件夹名!我们知道文件夹名,但不知道包名!此代码的用户可能会将其类写入另一个包中,并将其放入我所说的文件夹路径中!我想知道是否有任何方法可以独立于包名加载类?关于备注:首先感谢您的建议,No.1和No.3 y你说得对。谢谢。第二,我决定检查加载的类是否是我接口的实例。如果是,我需要保留它们,否则不需要保留它们。
    File root = new File("<rootFolder>");
    File[] files = root.listFiles()
    
    for(File f : files) {
      if(f.isDirectory()) {
        // do processing
      }
    }