从Jar文件加载动态类

时间:2014-11-02 17:01:09

标签: java android classloader

我一直在试图弄清楚如何在运行时从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;编辑方法。

1 个答案:

答案 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中存在的任何类,包括库引用。