我一直在试图弄清楚如何在运行时从jar文件动态加载类,知道要加载它们的包的名称。我试过这个:How to get all classes names in a package?它没有用,我后来意识到这是针对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");
这是如何最好地解决的?我已经研究了很多,并认为我可能会采用错误的方式。最后我只想加载一个包中的所有类,而不知道除了包名之外的所有类,以便更容易&#34;删除类中的#34;编辑方法。
答案 0 :(得分:0)
技术上可行如下:
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中存在的任何类,包括库引用。