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

时间:2017-03-28 14:39:20

标签: java reflection stack-trace callstack

这是一个用几个参数调用我的方法的库。我想收到另一个论点,但是图书馆并没有将它提供给它所调用的方法。

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

有没有办法可以获得实例? SecurityManager has 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.
    }
}

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

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

3 个答案:

答案 0 :(得分:2)

借助您提供的代码,我可以考虑编写一个方面,我的意思是使用aop并尝试使用joinpoint来获取传递给构造函数A()的参数

答案 1 :(得分:1)

  

不知怎的,我想从这里得到A的b的调用实例

简短回答:你不能。

答案很长:如果您在调试器或自己的自定义JVM上运行它,就可以获得它。

另一个解决方案:使用面向方面的编程与AspectJ

这样的框架

答案 2 :(得分:0)

你做不到。有关详细信息,请参阅this post

没有'所有者',所以除非指定了对父项的显式引用,否则无法获取调用实例:

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

class D {
    D(A a, int c) {
        ...
    }
}

似乎根据图书馆你不应该得到这样的例子,或者它的设计很差。