2008-11-12 54 views
8

Giả sử rằng tôi có một lớp Java với một phương pháp tĩnh, như vậy:Lớp nào đã gọi phương thức tĩnh của tôi?

 
class A 
{ 
    static void foo() 
    { 
     // Which class invoked me? 
    } 
} 

Và giả sử thêm rằng lớp A có một số tùy ý các lớp con:

 
class B extends A { } 
class C extends A { } 
class D extends A { } 
... 

Bây giờ xem xét các lời gọi phương pháp sau đây :

 
A.foo(); 
B.foo(); 
C.foo(); 
D.foo(); 
... 

Câu hỏi của tôi là, làm cách nào để gọi lớp học?

Trả lời

10

Nó không thể, và đó là một phần của vấn đề với phương pháp tĩnh. Theo như trình biên dịch có liên quan A.foo()B.foo() là chính xác điều tương tự. Trong thực tế, chúng biên dịch xuống cùng một bytecode. Bạn không thể nhận được nhiều hơn tương tự.

Nếu bạn thực sự cần loại thông tin này, hãy sử dụng một singleton và xoay foo() thành một phương pháp thể hiện. Nếu bạn vẫn thích cú pháp tĩnh, bạn có thể xây dựng một mặt tiền A.foo().

3
class A 
{ 
    static void foo(A whoIsCalingMe) 
    { 
     // Which class invoked me? 
    } 
} 
4

Mặc dù bạn không thể tìm ra các lớp phương pháp tĩnh được gọi trên, người ta có thể tìm ra các lớp thực gọi phương pháp trong thời gian chạy:

static void foo() 
{ 
    Throwable t = new Throwable(); 
    StackTraceElement[] trace = t.getStackTrace(); 
    String className = trace[1].getClassName(); 
    Class whoCalledMe = null; 
    try 
    { 
     whoCalledMe = Class.forName(className); 
    } 
    catch(Exception e) 
    { 
    } 
} 

tôi 'không nói rằng đây là thực hành tốt và nó có lẽ không tuyệt vời từ một quan điểm hiệu suất, hoặc, nhưng nó sẽ làm việc. Không biết nếu điều đó giúp bạn bất kỳ ...

+0

Yuck. Nó hoạt động; nhưng sự phản ánh IIRC đã cố ý làm xấu đi để ngăn cản những thứ này. – jamesh

+0

Tôi đang tìm cách viết một phương thức tiện ích tĩnh 'trace (String s)' sao cho, nếu một phương thức trong lớp Foo gọi 'trace (" hi ")', nó sẽ ghi vào SYSOUT: ** Foo: hi **. Điều này xuất hiện để làm các trick. – Chap

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