所以这是我的问题。我正在创建一个类似于 DOS 命令行的软件。我希望人们能够通过简单地将包含扩展基Command
类的类的 jar 文件拖放到文件夹中来添加其他命令。我没有尝试过任何工作。
这是我尝试过的:
- 使用 Reflections 库添加在 jar 文件中搜索扩展 Command 类的类
这引发了许多错误,只是没有在我的 jar 中找到大多数类。我认为这与正在发生的所有SomeClass$1.class
事情有关。 - 遍历 jar 中的每个文件并将其添加到类路径中,
我找不到一种方法来实现这一点,因为我根本无法将迭代ZipEntry
转换为可以添加到类路径中的任何内容,例如 URL。 - 将整个 jar 添加到类路径
这也不起作用,因为程序不知道这些类的名称,因此,它不能将它们转换为命令。
我想在这里得到一些帮助。任何关于如何使我的程序更具可扩展性的建议都将非常受欢迎。包括代码的+1;)
如果您需要任何进一步的信息,请告诉我。
编辑:
新代码:
URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader();
for(File file : FileHelper.getProtectedFile("/packages/").listFiles()) {
if(file.getName().endsWith(".jar")) {
Set<Class<?>> set = new HashSet<Class<?>>();
JarFile jar = null;
try {
jar = new JarFile(file);
Enumeration<JarEntry> entries = jar.entries();
while(entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if(!entry.getName().endsWith(".class"))
continue;
Class<?> clazz;
try {
clazz = ucl.loadClass(entry.getName().replace("/", ".").replace(".class", "")); // THIS IS LINE 71
} catch(ClassNotFoundException e) {
e.printStackTrace();
continue;
}
if(entry.getName().contains("$1"))
continue;
if(clazz.getName().startsWith("CMD_"))
set.add(clazz);
jar.close();
}
} catch(Exception e) {
//Ignore file
try {
jar.close();
} catch (IOException e1) {/* Don't worry about it too much... */}
OutputHelper.log("An error occurred whilst adding package " + OutputStyle.ITALIC + file.getName() + OutputStyle.DEFAULT + ". " + e.getMessage() + ". Deleting package...", error);
e.printStackTrace();
file.delete();
}
抛出的错误:
java.lang.ClassNotFoundException: com.example.MyCommands.CMD_eggtimer
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.MyWebsite.MyApplication.Commands.CommandList.update(CommandList.java:71)
上面的代码中已经标记了第 71 行。