gpt4 book ai didi

java - java java.lang.reflect.Field 的用例?

转载 作者:行者123 更新时间:2023-12-02 06:48:08 25 4
gpt4 key购买 nike

有一天,我在 spring-security(3.0.x 分支)中查看 acl 模块的源代码,我发现 ACLImpl 对象有一组私有(private)的 ACE(在 db 中由 1-many 反射表示) 。深入研究代码,我发现没有明显的点来填充私有(private) 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 中的私有(private)字段。除了混淆代码流之外还有其他原因吗?

最佳答案

除了访问私有(private)或其他不可访问的字段之外,java.lang.reflect.Field 与整个反射机制一般具有相同的目的:允许动态发现和操作在编译时不一定已知的类型。 Java 与许多其他语言一样,是静态类型的。反射机制允许人们在某种程度上绕过它,并引入一些更动态的功能,例如按名称检索字段的值。这是无价的,因为我们认为理所当然的一些工具所发挥的“魔力”都依赖于它——想想 JUnit、模拟框架、Hibernate、JAXP、gson……混淆代码流只是众多精彩功能之一。你可以使用 java.lang.reflect.Field 来实现:)

关于java - java java.lang.reflect.Field 的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com