0

前几天我在 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 中公开私有字段。除了混淆代码流之外还有其他原因吗?

4

1 回答 1

2

除了访问私有或其他不可访问的字段之外,java.lang.reflect.Field 的作用与整个反射机制一般:允许动态发现和操作在编译时不一定知道的类型。与许多其他语言一样,Java 是静态类型的。反射机制允许人们在某种程度上绕过它,并引入一些更动态的特性,例如,按名称检索字段的值。这是无价的,因为我们认为理所当然的一些工具所执行的“魔法”依赖于它——想想 JUnit、模拟框架、Hibernate、JAXP、gson ......你可以使用 java.lang.reflect.Field 的东西:)

于 2013-08-28T13:59:25.670 回答