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

问题描述 投票:0回答:4

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

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

有什么办法可以获取实例吗? 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.
    }
}

或者...我知道

b
被用作调用堆栈的参数。因此,如果有人知道我如何访问传递给
b
的构造函数的
A
,那将是可以接受的。

如果这些都不可行...我可以反编译

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

java reflection stack-trace callstack
4个回答
2
投票

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


1
投票

我想以某种方式从这里获取 A 的 b 的调用实例

简短的回答:你不能。

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

还有一个解决方案:使用像 AspectJ 这样的框架进行面向方面的编程


0
投票

你不能那样做。有关详细信息,请参阅这篇文章

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

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

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

根据库,您似乎不应该得到这样的实例,或者设计不当。


0
投票

我一直在寻找与 Java 8 类似的东西,在 Java 9+ 中,您可以尝试使用 StackWalker API - 它可以获得对调用对象的引用。

顺便说一句:除非你使用非普通的东西,否则你使用 AspectJ 的建议大多会遇到同样的问题(如果你想深入研究 AOP 并以这种方式解决它,我会看看 LTW)。

看这个:How can I get the caller class object from a method in java?

© www.soinside.com 2019 - 2024. All rights reserved.