[英]Dynamic Class Loading From Jar File
我一直试图弄清楚如何在运行时从jar文件中动态加载类,知道要从中加载它们的包的名称。 我已经尝试过了: 如何获取包中的所有类名? 它没有用,后来我意识到它是用于jar文件之外的程序的。 我还从另一个问题中提取了此代码段,我更喜欢它:
URL[] urls = ....
URLClassLoader loader = new URLClassLoader(urls);
Class<?> cls = loader.loadClass("com.example.core.Main");
Module module = (Module) cls.newInstance();
但是我看不到一种在定义的包中加载所有类的方法,例如
Class<?>[] cls = loader.loadPackage("com.example.core");
如何最好地解决? 我已经研究了很多,并认为我可能是错误的方法。 最终,我只想将包中的所有类加载,而除了包名之外什么都不知道,以便使用一种更容易的“将类放入”编辑方法。
这在技术上是可行的,如下所示:
private List<Class<?>> loadClassesInPackage(String packageName) {
ClassLoader loader = getClassLoader();
List<Class<?>> list = new ArrayList<Class<?>>();
// com\.package\.subpackage(?!.*\$).*
String regex = Pattern.quote(packageName) + "(?!.*\\$).*";
try {
DexFile df = new DexFile(getPackageCodePath());
for (Enumeration<String> e = df.entries(); e.hasMoreElements(); ) {
String s = e.nextElement();
if (s.matches(regex)) {
Log.d(TAG, "match: " + s);
list.add(loader.loadClass(s));
}
}
} catch (Exception e) {
Log.w(TAG, "exception while building class list", e);
}
return list;
}
它将按原样排除内部/匿名类。 此外,还有很多注意事项,例如,加载没有默认构造函数的类,抽象类等。这对于应用程序APK中存在的任何类(包括库引用)都应适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.