在Android中查找包中的所有类

use*_*504 15 java android

如何在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)

其余的是使用正则表达式或其他东西来过滤掉你想要的课程.

  • 自Android Gradle Plugin 2.0.0起,它无法正常工作 (4认同)

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上测试过

  • 自从Gradle 2.0.0起,这对我不起作用 (3认同)
  • DexFile已被弃用:此API将在未来的Android版本中删除.https://developer.android.com/reference/dalvik/system/DexFile.html (3认同)

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)

  • 这在 Android 中不起作用,reelections 库因不支持的 dex 类错误而崩溃 (14认同)