如何通过调用反射方法来检测何时修改属性

时间:2010-05-12 11:49:58

标签: java reflection

我有以下课程

public class MyClass {
   private int myAttr;

   public void setAttr(int a) { 
      myAttr = a; 
      Thread.dumpStack();
   }
}

这样我可以检测到任何修改myAttr的尝试。好吧,几乎任何。当有人使用myAttr方法修改Field.set()时,它不起作用。如何捕获Java反射用法?

2 个答案:

答案 0 :(得分:5)

你做不到。如果有人SecurityManager,你会受到{{1}}的摆布,以防止其他人对你做出令人讨厌的事情。

相关问题

答案 1 :(得分:1)

首先你需要问问自己你在这里真正担心的是什么。当然 - 如果有人真的想要,他们可以颠覆你的堆栈追踪器。但为什么你真的在乎呢?如果你真的关心,为什么你准备好运行他们的代码呢?

如果确实需要这样做,则需要创建一个安全沙箱,在其中运行可能会破坏堆栈跟踪器的代码。具体来说,您需要为其创建一个安全管理器

    securityManager.checkPermission(ReflectPermission("suppressAccessChecks"))

会针对不受信任的代码抛出SecurityException。然后使用安全管理器创建一个新的类加载器。

不幸的是,似乎没有办法限制setAccessible(...)特定的目标字段,方法或类。