Java:通过反射访问私有字段(行为)
Java: Accessing private field via reflection (behaviour)
小三 Java;使用反射可以访问私有字段(不问如何,
Question 1 and Question 2) 好的。
我的问题与此行为的性质有关。
- 有什么限制吗?我可以访问我遇到的任何
.class
的任何字段吗?
- 在我的代码中,一旦你将字段的可见性设置为 "public",它是永远改变还是直到上下文结束(方法,如果,对于...)? 代码如下
- 每个人都可以吗?我的意思是,Whosebug 的资深程序员,这是安全漏洞吗?
代码[已编辑]:
Field f = obj.getClass().getDeclaredField("field");
if (...) {
f.setAccessible(true);
// f IS accesible
}
// is f accesible?
有没有限制?
是 - 您需要多个 JVM permissions(最值得注意的是 accessDeclaredMembers
和 suppressAccessChecks
,在文档中标有粗体警告)才能正常工作;如果您的 JVM 的安全配置文件有些严格(例如,饱受诟病的小程序),您的代码将无法运行,因为这些权限将不可用。
它会永远改变吗?
是的,只要您的程序继续运行 运行,这些字段将保持可访问状态(只要您继续使用更改访问权限的同一 Field
实例)。
不好吗?
不一定。它允许 java 代码对具有私有字段的对象进行序列化和反序列化,它允许可以简化测试的复杂模拟,它允许您窥视您原本无法窥视的地方。但是,由于它超出预期,您应该谨慎使用它并确保用户知道您需要额外的权限和 "are looking under the hood"。文档(见上文)非常清楚地指出这被认为是有风险的,只有当你知道自己在做什么时才应该被允许。
小三 Java;使用反射可以访问私有字段(不问如何, Question 1 and Question 2) 好的。
我的问题与此行为的性质有关。
- 有什么限制吗?我可以访问我遇到的任何
.class
的任何字段吗? - 在我的代码中,一旦你将字段的可见性设置为 "public",它是永远改变还是直到上下文结束(方法,如果,对于...)? 代码如下
- 每个人都可以吗?我的意思是,Whosebug 的资深程序员,这是安全漏洞吗?
代码[已编辑]:
Field f = obj.getClass().getDeclaredField("field");
if (...) {
f.setAccessible(true);
// f IS accesible
}
// is f accesible?
有没有限制?
是 - 您需要多个 JVM permissions(最值得注意的是 accessDeclaredMembers
和 suppressAccessChecks
,在文档中标有粗体警告)才能正常工作;如果您的 JVM 的安全配置文件有些严格(例如,饱受诟病的小程序),您的代码将无法运行,因为这些权限将不可用。
它会永远改变吗?
是的,只要您的程序继续运行 运行,这些字段将保持可访问状态(只要您继续使用更改访问权限的同一 Field
实例)。
不好吗?
不一定。它允许 java 代码对具有私有字段的对象进行序列化和反序列化,它允许可以简化测试的复杂模拟,它允许您窥视您原本无法窥视的地方。但是,由于它超出预期,您应该谨慎使用它并确保用户知道您需要额外的权限和 "are looking under the hood"。文档(见上文)非常清楚地指出这被认为是有风险的,只有当你知道自己在做什么时才应该被允许。