2012-01-23 18 views
6

Xin chào có cách nào để biết tên lớp người gọi của một hàm, đặc biệt cho một ứng dụng Java-GWT không?Làm thế nào để biết lớp người gọi của một hàm

+0

bản sao có thể có của [Java: Find Caller Class] (http://stackoverflow.com/questions/2887607/java-find- caller-class) –

+1

Phản ánh và các API liên quan không được mô phỏng bởi GWT. Bạn cần phải tìm một cách khác để hoàn thành những gì bạn muốn. – Strelok

Trả lời

4

Thread.currentThread không được hỗ trợ trong GWT (hãy nhớ rằng mã java được biên soạn để javascript), vì vậy đây là một bản sao có thể xảy ra:

How do you find out the caller function in JavaScript?

Trong GWT bạn muốn chỉ đơn giản là viết một wrapper jsni:

public static native void whosMyCaller() /*-{ 
    $wnd.alert(arguments.callee.caller.toString()); 
}-*/; 
+0

Tôi sẽ áp dụng mã này như thế nào để có được callee với GWT? – xybrek

+0

Có chức năng "tiện ích" nào để làm điều đó không? – xybrek

+0

không có 'tiện ích' như vậy trong GWT (2.4.0), bạn có thể chỉ cần thực hiện một phương thức jsni – milan

0

Nó không thực sự khả thi trong GWT, vì trong mã chế độ sản xuất được tối ưu hóa rất nhiều với lớp lót và loại bỏ mã không thể truy cập được. Ví dụ. trong chế độ biên dịch, hầu hết các hàm không thuộc về bất kỳ lớp nào, vì GWT coi là định nghĩa lớp thừa. Về mặt lý thuyết, có thể tìm thấy lớp người gọi (nếu bạn cố gắng phân tích báo cáo biên dịch hoặc nếu thông qua JSNI), nhưng vì tối ưu hóa trong lớp, bạn sẽ nhận được rất nhiều kết quả lạ (ví dụ, ngay cả khi bạn chỉ gọi một số chức năng) lớp cụ thể, trong chế độ được biên dịch, bạn có thể thấy rằng nó được gọi trực tiếp từ phương thức nhập điểm onLoad)

+0

Trong bytecode là nó có thể? – xybrek

+0

Bạn có nghĩa là java? có thể thông qua Thread.currentThread(). getStackTrace() như những người khác đã nói. Trong DevMode, điều này cũng có thể xảy ra, nhưng tôi không chắc liệu class Thread có được cho phép trong DevMode hay không. Bạn có thể thử tạo một Ngoại lệ và phân tích stacktrace của nó. – jusio

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