java中导入外部类_Java:将类从外部源添加到类路径

所以这是我的问题.我正在创建一个类似于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> set = new HashSet>();

JarFile jar = null;

try {

jar = new JarFile(file);

Enumeration 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行已在上述代码中标记.

最佳答案 当我过去需要这样做时,我使用了第2点和第3点的组合,即我将jar文件添加到类路径中,然后遍历它列出它包含的文件以计算类的名称,并使用Class.forName(…)加载它们,以便我可以检查它们是否是我需要执行处理的类.

另一个选择是要求在jar文件的清单中标识类,或者通过其他元数据机制标识类.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值