这有两个部分。首先,您需要导入 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();
}
}