2015-10-08 5 views
5

Как можно получить экземпляр объекта вызывающего класса?Получить экземпляр вызывающего (через отражение)

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(); 
    } 
} 

Я знаю, что я могу узнать, позвонив класс/метод с помощью StackTrace, но мне нужен экземпляр конкретного видов доступа к переменному экземпляру (например, знач1 в примере).

Я знаю, что это грязно, но класс B находится в неизменяемой библиотеке, так что почти невозможно передать требуемое поле, не перестраивая все.

+1

Что делать, если нет ни одного случая, ? Зачем вам это нужно? –

+4

Нет, вы в принципе не можете этого сделать. –

ответ

2

Вы не можете получить доступ к экземпляру вызывающего объекта, если экземпляр каким-либо образом не передан ему или не хранится в коллекции.

Чтобы передать экземпляр вы можете сделать следующее:

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); 
    } 
} 

«это» keywork будет проходить экземпляр вызывающего кода к методу Foo в классе А

Смежные вопросы