这是一个用几个参数调用我的方法的库。我想收到另一个论点,但是图书馆并没有将它提供给它所调用的方法。
通过反编译库,我可以看到它有参数,并且它被分配给一个实例变量(不是私有的,但也不是公共的。)我知道如果我可以使用反射来获取变量有实例,但我也没有实例。
有没有办法可以获得实例? 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
。
答案 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) {
...
}
}
似乎根据图书馆你不应该得到这样的例子,或者它的设计很差。