我有以下课程
public class MyClass {
private int myAttr;
public void setAttr(int a) {
myAttr = a;
Thread.dumpStack();
}
}
这样我可以检测到任何修改myAttr
的尝试。好吧,几乎任何。当有人使用myAttr
方法修改Field.set()
时,它不起作用。如何捕获Java反射用法?
答案 0 :(得分:5)
你做不到。如果有人SecurityManager
,你会受到{{1}}的摆布,以防止其他人对你做出令人讨厌的事情。
答案 1 :(得分:1)
首先你需要问问自己你在这里真正担心的是什么。当然 - 如果有人真的想要,他们可以颠覆你的堆栈追踪器。但为什么你真的在乎呢?如果你真的关心,为什么你准备好运行他们的代码呢?
如果确实需要这样做,则需要创建一个安全沙箱,在其中运行可能会破坏堆栈跟踪器的代码。具体来说,您需要为其创建一个安全管理器
securityManager.checkPermission(ReflectPermission("suppressAccessChecks"))
会针对不受信任的代码抛出SecurityException
。然后使用安全管理器创建一个新的类加载器。
不幸的是,似乎没有办法限制setAccessible(...)
特定的目标字段,方法或类。