Java如何将一个类从另一个jar加载到我的jar以及如何使用它
//更新// 现在我可以加载一个Jar,但是如何从它运行方法呢Java如何将一个类从另一个jar加载到我的jar以及如何使用它,java,class,jar,Java,Class,Jar,//更新// 现在我可以加载一个Jar,但是如何从它运行方法呢 使用jar的文件url创建一个类加载器 让类加载器按名称加载游戏的主类 创建游戏主类的新实例 将其投射到插件加载器知道的“游戏”界面 调用界面上的方法来启动游戏 从需要插入的主JAR文件games.JAR: URLClassLoader urlClassLoader = URLClassLoader.newInstance(urlArray); 首先获取games.jar文件的URL(使用file.toURI().toURL()
从需要插入的主JAR文件
games.JAR
:
URLClassLoader urlClassLoader = URLClassLoader.newInstance(urlArray);
- 首先获取
文件的URL(使用games.jar
)并将其放入数组中(让我们调用数组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);
Class这有两个部分。首先,您需要导入jar。这可以在运行时使用以下方法完成: 现在,您可以在运行时导入jar。如果您只是拥有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>classes=new ArrayList cls=Class.forName(name); 类别。添加(cls); } } 返回类; }
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(); } }
File jarFile=新文件(“path/to/Games.jar”); 导入jar(jarFile);
列表您必须实现自定义类装入器,我如何实现??你能给出示例代码吗?我认为搜索java创建自定义类加载器并不难。无论如何:你能举个例子吗?然后我如何从这些类运行代码?Class.forName()返回一个类对象。在此对象上调用newInstance()以获取类的实例,您可以调用它的任何方法。好的,那么您可以帮助我吗?我有一个装有加载器的Jar,在第二个Jar中,我有一个我想从第一个Jar运行的方法,我要做什么?我编辑了答案。希望它更清楚。只需按照步骤操作。我如何在这个类中运行方法?如果构造函数有参数,可以使用
或cls.newInstance()
实例化该类。另请参阅我的更新。我总是收到一个错误[11:35:29错误]:启用Arcade v0.1时出错(是否为最新版本?)java.lang.NoClassDefFoundError:Arcade/interfaces/game@sentostv我不熟悉那个错误。也许您可以将所有JAR添加到类路径中,并省略cls.getConstructor(ArgumentClasses…).newInstance(arguments)
调用。好的,您能帮我吗?我有一个装有加载器的Jar,在第二个Jar中我有一个方法,我想从第一个Jar开始运行,我要做什么?importJar()
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(); } }