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