【问题标题】:Java how to load a Class from another jar to my jar and how to use it [closed]Java如何将另一个jar中的类加载到我的jar中以及如何使用它[关闭]
【发布时间】:2014-11-22 14:02:17
【问题描述】:

//更新//

现在我可以加载一个 Jar,但是如何从中运行方法?

【问题讨论】:

标签: java class jar


【解决方案1】:

这有两个部分。首先,您需要导入 jar。这可以在运行时使用轻微的hack with reflection 来完成:

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public void importJar(File file) {
    Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
    addURL.setAccessible(True);
    addURL.invoke(URLClassLoader.getSystemClassLoader(), new Object[] {file.toURI().toURL()});
}    

现在您可以在运行时导入 jar。如果你只有 jar 的路径,你可以轻松地将其转换为 File

importJar(new File("path/to/jar"));

其次,您需要找到 jar 中定义的类。似乎没有内置方法来执行此操作,因此您必须手动检查 jar 本身的类。

import java.lang.Class;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarFile;
import java.util.jar.JarEntry;
public List<Class<?>> findJarClasses(File file) {
    ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
    JarFile jar = new JarFile(file);
    Enumeration<JarEntry> entries = jar.entries();
    while (entries.hasMoreElements()) {
        JarEntry entry = entries.nextElement();
        String name = entry.getName();
        if (name.endsWith(".class")) {
            name = name.substring(0, name.lastIndexOf('.'));
            Class<?> cls = Class.forName(name);
            classes.add(cls);
        }
    }
    return classes;
}

最后,您可以遍历这些类以确定它们是否实现了您想要的接口。

File jarFile = new File("path/to/Games.jar");
importJar(jarFile);
List<Class<?>> classes = findJarClasses(jarFile);
for (Class<?> cls : classes) {
    if (cls.isInstance(YourInterface.class)) {
        // Instantiate class.
        YearInterface obj = (YourInterface)cls.newInstance();
        // Call `loaded()` method.
        obj.loaded();
    }
}

【讨论】:

  • 我怎样才能在这个类中运行一个方法?
  • 如果构造函数有参数,您可以使用cls.newInstance()cls.getConstructor(ArgumentClasses...).newInstance(arguments) 实例化类。另请参阅我的更新。
  • 我总是得到一个错误 [11:35:29 错误]:启用 Arcade v0.1 时出错(它是最新的吗?) java.lang.NoClassDefFoundError: arcade/interfaces/game
  • @sentostv 我不熟悉这个错误。也许您可以将所有 jar 添加到类路径中,并省略 importJar() 调用。
  • 好的,你能帮帮我吗?我有一个带有 Loader 的 Jar,在第二个 jar 中我有一个我想从第一个运行的方法,我必须做什么?
【解决方案2】:

从需要插入games.jar的主JAR文件:

  • 首先获取您的games.jar 文件的URL(使用File.toURI().toURL())并将其放入一个数组中(我们称该数组为urlArray)。
  • 接下来获取一个URLClassLoader 实例来加载games.jar

    URLClassLoader urlClassLoader = URLClassLoader.newInstance(urlArray);
    
  • 如果您将刚刚创建的新类加载器作为第三个参数传递,现在您可以使用 Class.forName 实例化 games.jar 中的任何类:

    Class<? extends Main> mainClass = (Class<? extends Main>)
    Class.forName("Main", true, urlClassLoader);
    
  • mainClass 上,您现在可以调用您的方法:mainClass.loaded();

【讨论】:

  • 然后我怎样才能从这些类中运行代码?
  • Class.forName() 返回一个 Class 对象。在这个对象上调用 newInstance() 来获取你的类的一个实例,你可以调用它的任何方法。
  • 好的,你能帮帮我吗?我有一个带有 Loader 的 Jar,在第二个 jar 中我有一个我想从第一个运行的方法,我必须做什么?
  • 我编辑了答案。希望它更清楚。只需按照步骤操作即可。
【解决方案3】:
  1. 使用 jar 的文件 url 创建一个类加载器。
  2. 要求类加载器按名称加载游戏的主类
  3. 创建游戏主类的新实例
  4. 将其投射到插件加载器知道的某个“游戏”界面
  5. 调用界面上的方法开始游戏。

【讨论】:

  • 你能举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多