在不知道包名的情况下加载特定文件夹中的所有类-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
}
}