繁体   English   中英

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

[英]Java: Accessing private field via reflection (behaviour)

Java初级; 使用反射可以访问私有字段(不问如何, 问题1问题2 )确定。

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

  1. 有没有限制? 我可以访问我遇到的任何.class任何字段吗?
  2. 在我的代码中,一旦你将字段的可见性设置为“public” ,它是永久改变还是直到上下文的结尾(方法,如果,对于......)? 代码如下
  3. 它是确定了的人呢? 我的意思是,StackOverflow的老年人程序员,这是一个安全漏洞吗?

代码[已编辑]:

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

有没有限制?

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

它会永远改变吗?

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

这不好吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM