繁体   English   中英

从Jar文件动态加载类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM