Java如何将一个Class从另一个jar加载到我的jar以及如何使用它

时间:2014-11-22 14:02:18

标签: java class jar

// // UPDATE

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

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:0)

  1. 使用jar文件网址创建一个类加载器。
  2. 要求班级负责人按名称加载游戏的主要课程
  3. 创建游戏主要类的新实例
  4. 将其投放到某些游戏&#39;接口你的插件加载器知道
  5. 在界面上调用方法以启动游戏。

答案 2 :(得分:0)

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

  • 首先获取games.jar文件的网址(使用File.toURI().toURL())并将其放入数组中(让我们调用数组urlArray)。
  • 接下来获取URLClassLoader个实例以加载games.jar

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

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