我正在嘗試爲舊的框架實現一些單元測試。我試圖嘲笑數據庫層。不幸的是,我們的框架有點老,並沒有使用最佳實踐,所以沒有明確的問題分離。我有點擔心試圖模擬數據庫層可能會使JVM加載大量甚至不會被使用的類。有沒有辦法讓ClassLoader加載哪些類?
我不太瞭解類裝載機,所以這可能不成問題。有沒有辦法在一個特定的ClassLoader已經加載的所有類上取得高峯,以證明底下發生了什麼?
我正在嘗試爲舊的框架實現一些單元測試。我試圖嘲笑數據庫層。不幸的是,我們的框架有點老,並沒有使用最佳實踐,所以沒有明確的問題分離。我有點擔心試圖模擬數據庫層可能會使JVM加載大量甚至不會被使用的類。有沒有辦法讓ClassLoader加載哪些類?
我不太瞭解類裝載機,所以這可能不成問題。有沒有辦法在一個特定的ClassLoader已經加載的所有類上取得高峯,以證明底下發生了什麼?
注意,使用
java -verbose
會產生輸出的大量信息。將輸出記錄到一個文件,然後使用grep。如果你有「三通」過濾器,你可以試試這個:
java -verbose | tee classloader.log
grep class classloader.log
我不確定。但有一種方法,我看到它可以完成。雖然它可能過於荒謬。你可以嘗試方面,併爲加載類加入切入點。 也許jvm參數-verbose也許有幫助。
您可以創建自己的Classloader並在單元測試期間使用它加載。有你自己的自定義類加載器打印出它在做什麼。
或者,如果你只是想知道哪些類被加載,這樣做:
java -verbose:class
作爲一種替代方式,你提到一個特定的類加載器,您可以使用此代碼段。只要你想改變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
}
}
如何嘲笑「讓JVM加載大量甚至不會被使用的類」? – 2009-09-22 15:44:40