反射在不知道包名的情况下加载特定文件夹中的所有类
我有一个代码,可以用相同的包名(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++;
}
# 1 楼答案
我想到两件事:
a.b.ClassName
的类,则该文件必须位于文件夹a/b/ClassName.class
中(否则,加载将失败)更新
如果你知道文件夹名,你也知道包名(这就是诀窍)。它必须在Java中相互对应。如果一个类在包
a.b
中,它必须在文件夹a/b/
中。如果你只知道根文件夹,例如,pathToRootFolder/a/b/
,你可以使用并检查每个文件是否为目录:
如果单个包结构中只有一个文件,应该只有一个目录,并且名称必须对应于包名(当然,您需要“进入目录”,直到没有进一步的嵌套,即没有子文件夹,最后一个文件夹包含您想要加载的实际类。这样可以提取目录结构,从而提取包名
结束更新
关于代码的一些附带说明:
//
在new File("..//940424//second")
(这是一个打字错误,应该是\\
)[顺便说一句:最好使用File.separator
]i
,但实际上使用了classCounter
李>addedClassName[classCounter] = classFileAdded[classCounter].getAbsolutePath().substring(classFileAdded[classCounter].getAbsolutePath().lastIndexOf("\\")+1);
中提取文件名,对吗?为什么不直接使用addedClassName[classCounter] = classFileAdded[classCounter].getName()
李># 2 楼答案
你可以试试这个:
在此之前,确保文件夹位于类路径中
maven依赖