获取调用者的实例(通过反射)

Mar*_*cel 6 java reflection instance

是否有可能获得调用类的实例对象?

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过stacktrace找出调用类/方法但我需要conrete实例来访问实例变量(例如示例中的val1).

我知道它很脏但B类是在一个不可加工的库中,因此几乎不可能在不重建所有内容的情况下通过所需的字段.

San*_*ian 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

“this”键会将调用代码的实例传递给 A 类中的 foo 方法