2015-10-08 25 views
5

là nó bằng cách nào đó có thể để có được đối tượng dụ của lớp gọi điện thoại?Lấy ví dụ của người gọi (thông qua sự phản ánh)

class A{ 
    void foo(){ 
     Object o = getCaller(); //?? expect instance of B 
     long val1 = ..   // get val1 of o via reflection 
     // do something where val1 is crucial 
    } 
} 

class B{ 
    double val1 = Math.random(); 

    public static void main(String[] args) { 
     new B().callFoo(); 
    } 

    void callFoo(){ 
     new A().foo(); 
    } 
} 

Tôi biết rằng tôi có thể tìm lớp/phương thức gọi qua stacktrace nhưng tôi cần cá thể riêng lẻ để truy cập các biến mẫu (ví dụ như val1).

Tôi biết nó bẩn nhưng lớp B nằm trong thư viện không thể thay đổi để gần như không thể vượt qua trường bắt buộc mà không cần xây dựng lại mọi thứ.

+1

gì nếu không có ví dụ ? Tại sao bạn thậm chí cần nó? –

+4

Không, về cơ bản bạn không thể làm điều này. –

Trả lời

2

Bạn không thể truy cập cá thể của người gọi trừ khi thể hiện bằng cách nào đó được chuyển đến nó hoặc được lưu trữ trong bộ sưu tập.

Để vượt qua các ví dụ bạn có thể làm như sau:

class A{ 
    void foo(Object caller){ 
     long val1 = ..   
     // do something where val1 is crucial 
    } 
} 

class B{ 
    double val1 = Math.random(); 

    public static void main(String[] args) { 
     new B().callFoo(); 
    } 

    void callFoo(){ 
     new A().foo(this); 
    } 
} 

Các "này" keywork sẽ vượt qua thể hiện của mã gọi phương pháp foo trong Class A

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