初级Java;使用反射可以访问私有字段(不询问如何, Question 1和Question 2)好的。
我的问题与此行为的性质有关。
.class
字段吗?代码[已编辑]:
Field f = obj.getClass().getDeclaredField("field");
if (...) {
f.setAccessible(true);
// f IS accesible
}
// is f accesible?
答案 0 :(得分:3)
有任何限制吗?
是的 - 您需要多个JVM permissions(最值得注意的是accessDeclaredMembers
和suppressAccessChecks
,在文档中标有大而粗的警告)才能使用此功能;如果您的JVM的安全配置文件有点严格(例如,备受诟病的applet),您的代码将无法运行,因为这些权限将不可用。
会永远改变吗?
是的,只要您的程序继续运行,字段仍然可以访问(只要您继续使用更改访问权限的同一Field
实例)。
不好吗?
不一定。它允许java代码使用私有字段序列化和反序列化对象,它允许复杂的模拟,可以简化测试,它允许您查看您无法查看的地方。然而,由于它打破了期望,你应该谨慎使用它,并确保用户知道你需要额外的权限,“正在寻找引擎”。文档(见上文)非常清楚地表明这被认为是有风险的,只有当你知道自己在做什么时才应该允许这样做。