2009-09-16 38 views
12

我正在嘗試爲舊的框架實現一些單元測試。我試圖嘲笑數據庫層。不幸的是,我們的框架有點老,並沒有使用最佳實踐,所以沒有明確的問題分離。我有點擔心試圖模擬數據庫層可能會使JVM加載大量甚至不會被使用的類。有沒有辦法讓ClassLoader加載哪些類?

我不太瞭解類裝載機,所以這可能不成問題。有沒有辦法在一個特定的ClassLoader已經加載的所有類上取得高峯,以證明底下發生了什麼?

+0

如何嘲笑「讓JVM加載大量甚至不會被使用的類」? – 2009-09-22 15:44:40

回答

15

注意,使用

java -verbose 

會產生輸出的大量信息。將輸出記錄到一個文件,然後使用grep。如果你有「三通」過濾器,你可以試試這個:

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

我不確定。但有一種方法,我看到它可以完成。雖然它可能過於荒謬。你可以嘗試方面,併爲加載類加入切入點。 也許jvm參數-verbose也許有幫助。

35

您可以創建自己的Classloader並在單元測試期間使用它加載。有你自己的自定義類加載器打印出它在做什麼。

或者,如果你只是想知道哪些類被加​​載,這樣做:

java -verbose:class 
1

作爲一種替代方式,你提到一個特定的類加載器,您可以使用此代碼段。只要你想改變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 
    } 
} 
相關問題