前几天我在 spring-security(3.0.x 分支)中查看 acl 模块的源代码,我发现一个 ACLImpl 对象有一组私有的 ACE(在 db 中由 1-many 反射表示)。深入研究代码,我发现没有明显的点填充了私有 ace 集。我花了一段时间才发现人口已经完成java.lang.reflect.Field
:
private final Field fieldAces = FieldUtils.getField(AclImpl.class, "aces");
...
fieldAces.setAccessible(true);
...
try {
fieldAces.set(acl, aces);
} catch (IllegalAccessException e) {
throw new IllegalStateException("Could not set AclImpl entries", e);
}
(从 复制的所有代码BasicLookupStrategy.java
)我认为 Field 主要用于在不起眼的 jar 中公开私有字段。除了混淆代码流之外还有其他原因吗?