【问题标题】:Dynamic Class Loading From Jar File从 Jar 文件中动态加载类
【发布时间】:2014-12-29 09:10:41
【问题描述】:

我一直试图弄清楚如何在运行时从 jar 文件中动态加载类,知道要从中加载它们的包的名称。我试过这个:How to get all classes names in a package? 它没有用,我后来意识到它是针对 jar 文件之外的程序的。我还从另一个问题中获取了这个 sn-p 代码,我更喜欢这个问题:

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");

如何最好地解决这个问题?我进行了很多研究,并认为我可能走错了路。最终我只想加载一个包中的所有类,除了包名之外什么都不知道,以便更轻松地“将类放入”编辑方法。

【问题讨论】:

  • 为什么要盲目加载特定包中的所有类?除非你知道完全限定的类名,否则你不能使用它们。
  • 我有另一个类将它们作为对象加载,将对象存储在具有分配 ID 的列表中,它们用作“定义”而不是执行代码的实际类。编辑:它们也都扩展了同一个类,这就是它们对我有用的原因。
  • "...而不是执行代码的实际类"。如果您不打算使用类来执行代码,则不需要类。几乎可以肯定,有更好的方法可以达到您想要的效果。
  • 我正在尝试将这些类用作对象(如块)的定义,但我不确定有什么更好的方法来解决这个问题。你将如何解决这个问题?我肯定已经看到了这种方法的很多问题,我已经找到了解决方案,但它仍然看起来很随意,而且很奇怪,就像你说的那样。我可能只是没有足够的 java 经验,看不到更简单的解决方案,所以你能给我一个提示吗?
  • 如果没有更详细地说明您要完成的工作,很难说。 SO 也不太适合关于建议或意见的问题。但是,您的问题有一个解决方案,并且本着 SO 的精神,尽管我有……道德疑虑,我仍会提供给您。 ^_^

标签: java android classloader


【解决方案1】:

这在技术上是可行的,如下:

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

【讨论】:

  • 谢谢。这就是我需要的
猜你喜欢
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多