如何在Android上找到包中的所有类?我使用PathClassLoader,但它总是返回一个空的枚举?
附加信息
尝试了建议的思考方法.关于反射图书馆的重要点夫妇.通过maven central提供的库与Android不兼容,并提供dex错误.我必须包含源代码并编译dom4j,java-assist.
反射的问题,我的原始解决方案是android中的PathClassLoader返回包的空枚举.
方法的问题是Android中的getResource总是返回空枚举.
final String resourceName = aClass.getName().replace(".", "/") + ".class";
for (ClassLoader classLoader : loaders) {
try {
final URL url = classLoader.getResource(resourceName);
if (url != null) {
final String normalizedUrl = url.toExternalForm().substring(0, url.toExternalForm().lastIndexOf(aClass.getPackage().getName().replace(".", "/")));
return new URL(normalizedUrl);
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
tao*_*tao 24
使用DexFile列出apk中的所有类:
try {
DexFile df = new DexFile(context.getPackageCodePath());
for (Enumeration<String> iter = df.entries(); iter.hasMoreElements();) {
String s = iter.nextElement();
}
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
其余的是使用正则表达式或其他东西来过滤掉你想要的课程.
Ser*_*kov 14
其实我找到了解决方案.感谢陶答复.
private String[] getClassesOfPackage(String packageName) {
ArrayList<String> classes = new ArrayList<String>();
try {
String packageCodePath = getPackageCodePath();
DexFile df = new DexFile(packageCodePath);
for (Enumeration<String> iter = df.entries(); iter.hasMoreElements(); ) {
String className = iter.nextElement();
if (className.contains(packageName)) {
classes.add(className.substring(className.lastIndexOf(".") + 1, className.length()));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classes.toArray(new String[classes.size()]);
}
Run Code Online (Sandbox Code Playgroud)
在Android 5.0 Lolipop上测试过
Mah*_*ahi -1
尝试这个..
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends Object>> allClasses
= reflections.getSubTypesOf(Object.class);
Run Code Online (Sandbox Code Playgroud)