Java:通过反射访问私有字段(行为)

时间:2015-04-29 15:05:08

标签: java reflection visibility

初级Java;使用反射可以访问私有字段(不询问如何, Question 1Question 2)好的。

我的问题与此行为的性质有关。

  1. 有任何限制吗?我可以访问我遇到的任何.class字段吗?
  2. 在我的代码中,一旦您将字段的可见性设置为让我们说“public”,它是永久更改还是直到上下文的结尾(方法,如果,for .. 。)? 以下代码
  3. 每个人都 ok 吗?我的意思是,StackOverflow的老年人程序员,这是一个安全漏洞吗?
  4. 代码[已编辑]:

      Field f = obj.getClass().getDeclaredField("field"); 
      if (...) {
         f.setAccessible(true);
         // f IS accesible
      }
      // is f accesible?
    

1 个答案:

答案 0 :(得分:3)

有任何限制吗?

是的 - 您需要多个JVM permissions(最值得注意的是accessDeclaredMemberssuppressAccessChecks,在文档中标有大而粗的警告)才能使用此功能;如果您的JVM的安全配置文件有点严格(例如,备受诟病的applet),您的代码将无法运行,因为这些权限将不可用。

会永远改变吗?

是的,只要您的程序继续运行,字段仍然可以访问(只要您继续使用更改访问权限的同一Field实例)。

不好吗?

不一定。它允许java代码使用私有字段序列化和反序列化对象,它允许复杂的模拟,可以简化测试,它允许您查看您无法查看的地方。然而,由于它打破了期望,你应该谨慎使用它,并确保用户知道你需要额外的权限,“正在寻找引擎”。文档(见上文)非常清楚地表明这被认为是有风险的,只有当你知道自己在做什么时才应该允许这样做。