回答
- 用jar的文件url创建一个类加载器。
- 请教类加载器的名字
- 加载游戏的主类,创建游戏的主类
- 投它的一个新的实例来一些“游戏”界面插件加载器知道
- 调用接口的方法开始游戏。
你能举个例子吗? – sentostv 2014-11-22 14:24:48
从那里你需要插入games.jar
主要JAR文件:
- 首先让网址为您
games.jar
文件(使用File.toURI().toURL()
),并把它放在一个数组(我们称之为数组urlArray
)。 下获得
URLClassLoader
实例加载games.jar
:URLClassLoader urlClassLoader = URLClassLoader.newInstance(urlArray);
现在你可以实例从
games.jar
任何类与Class.forName
如果你通过你刚刚创建的第三个参数的新的类装载器:Class<? extends Main> mainClass = (Class<? extends Main>) Class.forName("Main", true, urlClassLoader);
对
mainClass
您现在可以调用您的方法:mainClass.loaded();
这有两个部分。首先,你需要导入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()});
}
现在,你可以在运行时导入一个罐子。如果你只是有路径罐子,你可以很容易地将其转换为File
:
importJar(new File("path/to/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();
}
}
如何在这个类中运行一个方法? – sentostv 2014-11-22 17:33:10
如果构造函数有参数,你可以使用'cls.newInstance()'或'cls.getConstructor(ArgumentClasses ...)。newInstance(arguments)''实例化类。另见我的更新。 – cpburnz 2014-11-22 17:55:34
我总是得到一个错误[11:35:29错误]:启用Arcade v0.1时发生错误(是否是最新版本?) java.lang.NoClassDefFoundError:arcade/interfaces/game – sentostv 2014-11-23 10:36:02
- 1. Java,我该如何制作一个罐子来编辑另一个罐子
- 2. 运行从另一个罐子的罐子
- 3. Maven 3“超级罐子”如何在罐子内嵌入罐子?
- 4. 无法从dir加载类。有罐子的时候可以做罐装类解压缩/拆包罐子
- 5. 在另一台机器上从一个罐子里加载一个班级,而无需下载整个罐子
- 6. 错误加载的罐子
- 7. 在另一个罐子里面运行外部罐子
- 8. 码头:从另一个罐子加载上下文
- 9. 加载包含在一个罐子里
- 10. Java中,罐子
- 11. SBT:如何Dockerize一个胖罐子?
- 12. Android Studio - 如何导出其中有其他罐子的罐子?
- 13. java使用外部罐子
- 14. 如何从同一来源创建多个罐子,但是每个罐子的主要类别不同?
- 15. 如何从不同的罐子
- 16. android罐子。如何构建它们?
- 17. 如何找到java.rmi包的罐子
- 18. 如何从一个Java类读取文件,都是在同一个罐子
- 19. 添加罐子
- 20. 如何运行从罐子一个maven打包Clojure的应用
- 21. Hadoop的罐子或/斌/ Hadoop的罐子
- 22. 在飞行类加载与罐子
- 23. 的Servlet - 包括从另一个类等罐子
- 24. 从罐子
- 25. 如何使用外部罐子
- 26. JNLP从相对地址加载罐子
- 27. 从.NET项目IKVM加载罐子
- 28. 如何添加蚂蚁flaka罐子?
- 29. 的Java的HttpClient-4.1.2罐子
- 30. 装载所有它的组件类从outter罐子
你必须实现一个自定义类加载器 – 2014-11-22 14:03:45
,我该怎么做?你可以请示例代码 – sentostv 2014-11-22 15:20:39
我认为搜索* java创建自定义类加载器*并不困难。无论如何:http://publib.boulder.ibm.com/infocenter/javasdk/v1r4m2/index.jsp?topic=%2Fcom.ibm.java.doc.diagnostics.142%2Fhtml%2Fid1100。html – 2014-11-22 15:24:11