我有一个代码,用于加载具有相同包名称(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++;
}
答案 0 :(得分: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
}
}
如果单个包结构中只有一个文件,则应该只有一个目录,名称必须对应于包名称(当然,您需要“进入目录”直到没有进一步的嵌套,即没有子文件夹,这最后一个文件夹包含你想要加载的实际类。这种方式可以提取目录结构,从而提取包名。
结束更新
关于您的代码的一些注释:
//
为什么new File("..//940424//second")
(这是一个错字,应该是\\
)[btw:最好使用File.separator
] i
但实际上使用classCounter
?? 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>