簡體   English   中英

有沒有辦法讓ClassLoader加載哪些類?

[英]Is there a way to get which classes a ClassLoader has loaded?

我正在嘗試為舊框架實現一些單元測試。 我試圖模擬出數據庫層。 不幸的是,我們的框架有點陳舊,並沒有完全采用最佳實踐,因此沒有明確的關注點分離。 我有點擔心試圖模擬數據庫層可能會使JVM加載大量甚至無法使用的類。

我不太了解類加載器,所以這可能不是問題。 有沒有辦法在特定ClassLoader加載的所有類中達到峰值,以證明引擎蓋下發生了什么?

您可以創建自己的類加載器並在單元測試期間使用它加載。 讓自己的自定義類加載器打印出它正在做的事情。

或者,如果您只想知道加載了哪些類,請執行以下操作:

java -verbose:class

請注意使用

java -verbose

會產生大量的輸出。 將輸出記錄到文件,然后使用grep。 如果你有'tee'過濾器,你可以試試這個:

java -verbose | tee classloader.log
grep class classloader.log

我不確定。 但有一種方法我認為可以做到。 雖然這可能太荒謬了。 您可以嘗試方面並為loadclass設置切入點。 也許jvm參數-verbose可能有用。

作為替代方法,對於您提到的特定類加載器,您可以使用此代碼段。 如果需要,只需更改obj變量的值即可。

Object obj = this;
ClassLoader classLoader = obj.getClass().getClassLoader();
File file = new File("classloderClasses.txt");
if (file.exists()) {
    file.delete();
}
if (classLoader != null) {
    try {
        Class clClass = classLoader.getClass();
        while (clClass != ClassLoader.class) {
            clClass = clClass.getSuperclass();
        }
        java.lang.reflect.Field classesField = clClass.getDeclaredField("classes");
        classesField.setAccessible(true);
        Vector classes = (Vector) classesField.get(classLoader);
        FileOutputStream fos = new FileOutputStream("classloderClasses.txt", true);
        fos.write(("******************** " + classLoader.toString() + " ******************** " + "\n").getBytes());
        fos.write(Arrays.toString(classes.toArray()).getBytes());
        fos.close();
    } catch (Exception exception) {
        exception.printStackTrace();
        // TODO
    }
}

您可以使用-Xlog選項配置或啟用Java虛擬機(JVM)統一日志記錄框架的日志記錄。 優點是您可以將結果寫入文本文件

概要

-Xlog[:[what][:[output][:[decorators][:output-options [,...]]]]]

在Unified Logging語法中, -verbose:class equals -Xlog:class+load=info

例如

java -Xlog:class+load=info:classloaded.txt

Ocarle doc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM