2010-10-25 27 views

Trả lời

9

this.getClass() = lớp hiện tại
this.getClass(). GetPackage() = gói hiện
Class.getName() = chuỗi các tên lớp
Package.getName() = chuỗi các tên gói

Tôi tin rằng bạn đang tìm kiếm API phản chiếu để có được tương đương với nội tâm (http://download.oracle.com/javase/tutorial/reflect/).

4

@ Câu trả lời của Christopher giải quyết vấn đề tên lớp học.

AFAIK, thư viện lớp Java chuẩn không cung cấp cách trực tiếp để giữ tên tệp cho lớp của đối tượng.

Nếu lớp đã được biên soạn với các thiết lập tùy chọn thích hợp "-g", bạn có thể có khả năng có được lớp filename gián tiếp như sau:

  • Tạo một đối tượng ngoại lệ trong một trong những phương pháp lớp học.
  • Nhận thông tin theo dõi ngăn xếp của ngoại lệ bằng cách sử dụng Throwable.getStackTrace().
  • Tìm nạp phần tử stacktrace cho phương pháp hiện tại và sử dụng StackTraceElement.getFilename() để tìm nạp tên tệp nguồn.

Lưu ý điều này có khả năng tốn kém và không đảm bảo rằng tên tệp sẽ được trả lại hoặc đó sẽ là tên bạn mong đợi.

+0

tôi không thể trích dẫn nguồn của tôi cho điều này , nhưng tôi nhớ đọc ở đâu đó rằng nếu bạn quyết định làm điều gì đó như vậy (và XIN giữ nó ra khỏi mã mức sản xuất), bạn có thể tăng tốc nó bằng cách sử dụng các ngoại lệ gốc (chẳng hạn như NullPointerException) thay vì chỉ đơn giản là xây dựng của riêng bạn ngoại lệ đã được lưu trữ (? đầu cơ trên tác giả gốc ' một phần). IE: thử {Object o; o.toString(); } catch (NullPointerException e) {} nhanh hơn so với try {throw new Exception ("foo")} catch (Exception e) {} – cwallenpoole

+1

Điều đó sẽ không hoạt động. Ngoại lệ cần phải được khởi tạo theo cách thông thường để cho phép bạn nắm bắt thông tin stacktrace cho ngữ cảnh hiện tại. Cho dù bạn chỉ đơn giản là xây dựng nó hoặc làm một cái gì đó để làm cho JVM xây dựng nó tạo ra sự khác biệt nhỏ. (Trong thực tế, tôi nghi ngờ rằng sau này sẽ thực sự chậm hơn bởi vì ngoại lệ phải được ném và bị bắt là tốt.) –

3

Bạn có thể lấy thư mục (trừ gói) có chứa các tập tin lớp:

SomeClass.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm(); 
1

Bạn có thể sử dụng sự phản xạ để điều hướng các stacktrace:

new Throwable().getStackTrace()[1].getFileName() 
new Throwable().getStackTrace()[1].getClassName() 
new Throwable().getStackTrace()[1].getMethodName() 
new Throwable().getStackTrace()[1].getLineNumber() 
Các vấn đề liên quan