我可以在Java中获取调用对象的实例吗?

Art*_*are 6 java reflection callstack stack-trace

有一个库用一些参数调用我的方法.我想收到另一个参数,但是库没有将它提供给它调用的方法.

通过反编译库,我可以看到它有参数,并且它被分配给一个实例变量(不是私有的,但也不是公共的.)我知道如果我有实例,我可以使用反射获取变量,但是我不知道也没有实例.

有没有办法可以获得实例?SecurityManager有getClassContext(),但这只是给我实例的类 - 我想要实例本身.

作为我想要的一个简单例子:

public class A {
    int b;
    public A(int b, int c) {
        this.b = b;
        D(c);
    }
}

public class D {
    public D(int c) {
        // Somehow I want to get at the calling instance of A's b from here,
        // and A belongs to a library which I didn't write.
    }
}
Run Code Online (Sandbox Code Playgroud)

或者......我知道b在callstack上用作参数.因此,如果有人知道如何访问b传递给A构造函数的内容,那将是可以接受的.

如果这些都不可行......我可以A按照我想要的方式进行反编译和编译,然后我需要做一些类加载魔法或者我必须修改jar的内容.这些都不合适,所以我希望有人知道如何从调用堆栈访问实例A或参数b.

MC *_*ror 0

你不能这样做。请参阅这篇文章了解更多详细信息。

不存在“所有者”这样的东西,因此您无法获取调用实例,除非指定了对父级的显式引用:

class A {
    int b;
    A(int b, int c) {
        this.b = b;
        new D(this, c);
    }
}

class D {
    D(A a, int c) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

看来,要么根据库,你不应该得到这样的实例,要么它设计得很糟糕。