簡體   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