2009-09-16 7 views
12

Tôi đang cố gắng thực hiện một số thử nghiệm đơn vị cho một khung cũ. Tôi đang cố gắng để loại bỏ lớp cơ sở dữ liệu. Rất tiếc, khung công tác của chúng tôi hơi cũ và không hoàn toàn sử dụng các phương pháp hay nhất nên không có sự phân biệt rõ ràng các mối quan tâm. Tôi hơi lo lắng rằng cố gắng để thử ra lớp cơ sở dữ liệu có thể làm cho JVM tải một số lượng lớn các lớp mà thậm chí sẽ không được sử dụng.Có cách nào để tải lớp học mà Trình nạp lớp đã tải không?

Tôi không thực sự hiểu trình tải lớp học tốt nên đây có thể không phải là vấn đề. Có cách nào để có một đỉnh cao ở tất cả các lớp học một ClassLoader cụ thể đã được tải để chứng minh những gì đang xảy ra dưới mui xe?

+0

Làm thế nào giả mạo "làm cho JVM tải một số lượng lớn các lớp thậm chí sẽ không được sử dụng"? –

Trả lời

15

Được cảnh báo rằng việc sử dụng

java -verbose 

Sẽ tạo ra một số lượng lớn sản lượng. Đăng nhập đầu ra vào một tập tin và sau đó sử dụng grep. Nếu bạn có bộ lọc 'tee', bạn có thể thử tính năng này:

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

Tôi không chắc chắn. Nhưng có một cách tôi thấy nó có thể được thực hiện. Nó có lẽ quá lố bịch vô lý. Bạn có thể thử các khía cạnh và đặt một pointcut cho loadclass. Cũng có thể đối số jvm -verbose có thể hữu ích.

35

Bạn có thể tạo Trình nạp lớp của riêng mình và sử dụng nó để tải trong khi kiểm tra đơn vị. Có Trình xếp lớp tùy chỉnh của riêng bạn in ra những gì nó đang làm.

Hoặc nếu bạn chỉ muốn biết mà lớp được nạp, làm:

java -verbose:class 
1

Là một cách khác, cho bộ nạp lớp cụ thể như bạn đã đề cập, bạn có thể sử dụng đoạn mã này. Chỉ cần thay đổi giá trị của biến obj nếu bạn muốn.

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 
    } 
}