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

Java: Accessing private field via reflection (behaviour)

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

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

  1. 有什么限制吗?我可以访问我遇到的任何 .class 的任何字段吗?
  2. 在我的代码中,一旦你将字段的可见性设置为 "public",它是永远改变还是直到上下文结束(方法,如果,对于...)? 代码如下
  3. 每个人都可以吗?我的意思是,Whosebug 的资深程序员,这是安全漏洞吗?

代码[已编辑]:

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

有没有限制?

是 - 您需要多个 JVM permissions(最值得注意的是 accessDeclaredMemberssuppressAccessChecks,在文档中标有粗体警告)才能正常工作;如果您的 JVM 的安全配置文件有些严格(例如,饱受诟病的小程序),您的代码将无法运行,因为这些权限将不可用。

它会永远改变吗?

是的,只要您的程序继续运行 运行,这些字段将保持可访问状态(只要您继续使用更改访问权限的同一 Field 实例)。

不好吗?

不一定。它允许 java 代码对具有私有字段的对象进行序列化和反序列化,它允许可以简化测试的复杂模拟,它允许您窥视您原本无法窥视的地方。但是,由于它超出预期,您应该谨慎使用它并确保用户知道您需要额外的权限和 "are looking under the hood"。文档(见上文)非常清楚地指出这被认为是有风险的,只有当你知道自己在做什么时才应该被允许。