前几天我在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主要用于在晦涩的罐子里披露私人田地。除了混淆代码流之外还有其他原因吗?
答案 0 :(得分:2)
除了访问私有或其他不可访问的字段之外,java.lang.reflect.Field通常与整个反射机制具有相同的目的:允许动态发现和操作在编译时不一定已知的类型。与许多其他语言一样,Java是静态类型的。反射机制允许人们在某种程度上绕过它,并引入一些更动态的特征,比如,按名称检索字段值。这是非常宝贵的,因为我们认为理所当然的一些工具执行的大部分“魔法”依赖于它 - 想想JUnit,模拟框架,Hibernate,JAXP,gson ......混淆代码流程只是过多的精彩内容之一你可以使用java.lang.reflect.Field来获取:)