在不知道包名称的情况下将所有 类 加载到特定文件夹中 - 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>
我想到两件事:
- 如果你想加载classes,相应的文件夹必须在你的class路径中(你能确保这一点——因为你不知道文件夹的名字吗?)
- 如果要加载 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。这样可以提取目录结构,从而提取包名称。
结束更新
关于您的代码的一些旁注:
- 为什么
//
in new File("..//940424//second")
(这是一个错字,应该是 \
)[顺便说一句:最好使用 File.separator
]
- 为什么你的 for 循环中有变量
i
但实际上使用 classCounter
??
- 在
addedClassName[classCounter] = classFileAdded[classCounter].getAbsolutePath().substring(classFileAdded[classCounter].getAbsolutePath().lastIndexOf("\")+1);
你提取的文件名对吧?为什么你不直接使用 addedClassName[classCounter] = classFileAdded[classCounter].getName()
?
我有一个代码可以将所有 类 加载到具有相同包名 ( 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>
我想到两件事:
- 如果你想加载classes,相应的文件夹必须在你的class路径中(你能确保这一点——因为你不知道文件夹的名字吗?)
- 如果要加载 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。这样可以提取目录结构,从而提取包名称。
结束更新
关于您的代码的一些旁注:
- 为什么
//
innew File("..//940424//second")
(这是一个错字,应该是\
)[顺便说一句:最好使用File.separator
] - 为什么你的 for 循环中有变量
i
但实际上使用classCounter
?? - 在
addedClassName[classCounter] = classFileAdded[classCounter].getAbsolutePath().substring(classFileAdded[classCounter].getAbsolutePath().lastIndexOf("\")+1);
你提取的文件名对吧?为什么你不直接使用addedClassName[classCounter] = classFileAdded[classCounter].getName()
?