2012-03-26 46 views
5

Phiên bản ngắn: Tôi cần tìm một cách trong Java để xác định vị trí Method trước đó trong ngăn xếp cuộc gọi (lưu ý thủ đô 'M' trong Phương thức - Tôi cần đối tượng java.lang.reflect.Method thực).Tìm phương thức gọi trong Java

Bối cảnh: Tôi đang làm việc trên phần mở rộng cho khái niệm Google ổi Preconditions.checkNotNull(...) cho phép lập trình viên kiểm tra đồng thời TẤT CẢ các tham số cho null và xây dựng NPE dựa trên tên tham số của phương thức gọi. Ví dụ:

public class MyClass 
{ 
    public void myMethod(Object arg1, Integer arg2, String arg3) 
    { 
     MyPreconditions.checkAllNotNull(arg1, arg2, arg3); 
    } 
} 

Vì vậy, nếu đối số đầu tiên là null, thì NPE có thể đọc arg1 cannot be null (MyClass:myMethod(Object, Integer, String)

Tôi đã làm việc ra làm thế nào để có được gọi Class và tôi có thể nhận được những cái tên tham số qua mùa xuân LocalVariableTableParameterNameDiscoverer (hoặc qua thư viện Paranamer), tôi có số Method. Phần duy nhất mà tôi không thể tìm ra là làm thế nào để có được Method chính nó.

Tôi biết rằng bạn có thể sử dụng theo dõi ngăn xếp để lấy phương thức tên, nhưng điều đó không giúp ích nếu phương pháp bị ghi đè. Có cách nào (ngay cả với các lớp com.sun nội bộ) để có được ngăn xếp thực tế? Ngoài ra, tôi có thể lấy số dòng cho phương thức gọi, vậy có cách nào để tìm số dòng của một số Method được truy xuất từ ​​đối tượng Class không?

+0

Bản sao của http://stackoverflow.com/questions/421280/in-java-how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection –

Trả lời

1

"Tôi biết rằng bạn có thể sử dụng dấu vết ngăn xếp để lấy tên phương thức, nhưng điều đó không giúp ích nếu phương pháp bị ghi đè." - Theo dõi ngăn xếp chứa tên lớp (và tệp nguồn), tuy nhiên, theo cách thức đúng, ngay cả khi phương pháp đã bị ghi đè.

Tôi không nghĩ có cách nào (tốt, nhất quán) để nhận đối tượng Method thực tế. Đặc biệt không phải là một trong những hoạt động với một người quản lý bảo mật hoạt động. Bản thân mã bảo mật Java sử dụng một số thủ thuật để làm điều đó, nhưng việc sao chép nó sẽ không thể di chuyển giữa các máy ảo khác nhau.

3

Thread.getStackTrace() cung cấp cho bạn stacktrace hiện tại. Từ đó bạn có thể lấy tên lớp và tên phương thức (ngay cả khi phương thức được ghi đè, bạn sẽ thấy lớp chính xác ở đó), và nhận phương thức thông qua sự phản chiếu.

Nhưng imo - điều này thật kỳ lạ và không cần thiết. Và điều về nó - bạn đang cung cấp một thông điệp mà chủ yếu đã có trong stacktrace sẽ được tạo ra nếu cuộc gọi Preconditions không thành công.

+0

Bạn có thể ' t nhất quán giải quyết đối tượng 'Method' nếu lớp đó đến từ một trình nạp lớp khác, tuy nhiên. – Dolda2000

+0

Bạn có thể nhận được dấu vết trực tiếp từ 'Throwable', một cái gì đó như:' try {throw new Exception ("cố ý");} catch (Exception e) {e.getStackTrace(); } '. Nhưng đã đồng ý rằng nó hơi lạ khi cần nó ... – user268396

+0

@ Dolda2000 là phương thức 'getClassLoader()' của các đối tượng 'Class'. Hoặc là bạn nhận được một cá thể 'ClassLoader' hợp lệ hoặc bạn nhận được' null' có nghĩa là bộ nạp khởi động. Sau đó, bạn lấy nó từ đó ...? – user268396

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