有一个库用几个参数调用我的方法。我想收到另一个参数,但库没有将它提供给它调用的方法。
通过反编译库,我可以看到它有参数,并且它被分配给一个实例变量(不是私有的,但也不是公共的。)我知道如果我有实例,我可以使用反射获取变量,但我也没有实例。
有什么办法可以获取实例吗? 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
。
在您提供的代码的帮助下,我可以考虑编写一个方面,我的意思是使用 aop 并尝试使用连接点来获取传递给构造函数 A() 的参数
我想以某种方式从这里获取 A 的 b 的调用实例
简短的回答:你不能。
长答案:如果您在调试器或您自己的自定义 JVM 上运行它,您可以获得它。
还有一个解决方案:使用像 AspectJ 这样的框架进行面向方面的编程
你不能那样做。有关详细信息,请参阅这篇文章。
没有“所有者”这样的东西,因此您无法获取调用实例,除非指定了对父级的显式引用:
class A {
int b;
A(int b, int c) {
this.b = b;
new D(this, c);
}
}
class D {
D(A a, int c) {
...
}
}
根据库,您似乎不应该得到这样的实例,或者设计不当。
我一直在寻找与 Java 8 类似的东西,在 Java 9+ 中,您可以尝试使用 StackWalker API - 它可以获得对调用对象的引用。
顺便说一句:除非你使用非普通的东西,否则你使用 AspectJ 的建议大多会遇到同样的问题(如果你想深入研究 AOP 并以这种方式解决它,我会看看 LTW)。
看这个:How can I get the caller class object from a method in java?