2009-04-22 29 views
20

Tôi nghĩ đây là một tình huống mà mọi lập trình viên Java chạy vào nếu họ làm đủ lâu. Bạn đang thực hiện một số sửa lỗi và thực hiện thay đổi đối với lớp học. Khi bạn đi để chạy lại chương trình, những thay đổi này dường như không được chọn mà là lớp cũ vẫn có vẻ như đang chạy. Bạn làm sạch và xây dựng lại mọi thứ, cùng một vấn đề. Đôi khi, điều này có thể đi đến một vấn đề classpath, của cùng một lớp đang được trên classpath nhiều hơn một lần, nhưng có vẻ không phải là một cách dễ dàng để tìm ra nơi mà các lớp được nạp là đến từ ...Ở đâu trên hệ thống tệp là lớp Java của tôi được tải từ?

Có cách nào để tìm đường dẫn tệp cho lớp đã được tải không? Một cái gì đó thích hợp hơn sẽ hoạt động nếu lớp được tải từ một tệp .class hoặc một tệp .jar. Bất kỳ ý tưởng?

+0

này gần giống như câu hỏi sau, có câu trả lời hơi khác: http://stackoverflow.com/questions/947182/how-to-explore-which-classes-are-loaded-from-which-jars –

Trả lời

26

Chỉ cần chạy java bằng cách sử dụng công tắc dòng lệnh chuẩn "-verbose:class" (xem the java documentation). Điều này sẽ in ra mỗi khi một lớp được tải và cho bạn biết nơi nó được nạp từ đó.

+0

Thực ra, bất kỳ JVM, vì -verbose là một cờ bắt buộc, có phải là không. Đó là các cờ -X phụ thuộc vào nhà cung cấp. –

+0

Cảm ơn, tôi đã đề cập đến điều đó. –

13

Nếu bạn muốn làm điều đó lập trình từ bên trong ứng dụng, hãy thử:

URL loc = MyClass.class.getProtectionDomain().getCodeSource().getLocation(); 

(Lưu ý, getCodeSource() có thể trở lại null, do đó, không thực sự làm được điều này tất cả trong một dòng :))

+0

getProtectionDomain cũng có thể trả về null (thường là đối với các lớp khởi động). Câu hỏi của tôi là, nếu các thay đổi không hiển thị, làm thế nào để bạn chạy mã này? :) –

0

Khi lớp học cần phải đến từ đâu đó trong đường dẫn lớp học, tôi sẽ khuyên bạn nên chỉ đơn giản là print the class path và kiểm tra xem có một phiên bản cũ của lớp bạn ở đâu đó không.

+3

Thực ra, không còn đúng nữa. Có các lớp hệ thống, các thư mục mở rộng (có, số nhiều), các trình nạp lớp mở rộng động (ala URLClassLoader). Những ngày này, nơi lớp học thực sự đến từ có thể khá phức tạp. –

+0

-1 vì không chính xác (xem bình luận của Monkey Software) –

+0

Làm thế nào để đi về việc in đường dẫn lớp học? Liên kết bạn cung cấp bị hỏng. – Dezza

5
public static URL getClassURL(Class klass) { 
    String name = klass.getName(); 
    name = "/" + convertClassToPath(name); 
    URL url = klass.getResource(name); 
    return url; 
} 

public static String convertClassToPath(String className) { 
    String path = className.replaceAll("\\.", "/") + ".class"; 
    return path; 
} 

Chỉ cần dán vào nơi nào đó và chuyển đối tượng Lớp cho lớp bạn muốn tìm định nghĩa. Nó sẽ hoạt động bất kể nó được gọi từ đâu, vì nó gọi getResource() trên lớp đang được tìm kiếm.

public static void main(String[] args) { 
    System.out.println(getClassURL(String.class));  
} 

Mẫu đầu ra: jar: file:! /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar /java/lang/String.class

Các vấn đề liên quan