【发布时间】:2017-08-21 16:52:52
【问题描述】:
有一个库用几个参数调用我的方法。我想接收另一个参数,但库没有将它提供给它调用的方法。
通过反编译库,我可以看到它有参数,并且它被分配给一个实例变量(不是私有的,但也不是公共的。)我知道如果我有实例,我可以使用反射来获取变量,但我也没有实例。
有什么方法可以访问实例吗? 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 被用作调用堆栈上的参数。因此,如果有人知道我如何访问传递给A 的构造函数的b,那将是可以接受的。
如果这些都不可行...我可以反编译 A 并按照我想要的方式编译它,然后我要么需要做一些类加载向导,要么我必须修改 jar 的内容.这些听起来都不理想,所以我希望有人知道如何从调用堆栈访问A 的实例或b 的参数。
【问题讨论】:
-
如果“b”没有吸气剂,你就不应该得到它......或者那是一个可怕的图书馆。您可以尝试将对象序列化为可读字符串(例如使用 Gson 或其他库的 Json),但我不确定它是否会为您提供已编译库中对象的私有字段。
-
@Wietlol - 如果
b有一个吸气剂,那么这里没有区别。问题是我需要找出如何获取正在构造D的A的实例。 -
啊,我明白了。简单来说,这是不可能的。但是,如果您可以跟踪创建了“A”的哪个对象,则可以将其放入静态变量中。但是,在这种情况下,这可能只能通过覆盖 A
-
为什么还要得到
A的实例呢? -
@MCEmperor - 所以我可以从中得到
b。好的,所以在实际场景中,我正在使用的库希望我为类提供加密和解密密码的方法。不过,它传入的只是加密或解密的字符串。我想通过包含随机生成的每用户盐来加强这一点。所以我需要获取用户名,但图书馆没有提供。我已经反编译了库并且知道它有用户名,但它没有将它传递给我的方法 - 它只提供一个字符串。
标签: java reflection stack-trace callstack