假设,我有很多类,它们是使用Java反射构造的(出于某种原因)。现在我需要将值后注入字段,这些字段是 ,注释号为@PostInject
。Java:什么是使用反射注入字段的最快方法?
public class SomeClass {
@PostInject
private final String someString = null;
public void someMethod() {
// here, someString has a value.
}
}
我的问题是:什么是快速的方式使用反射来设置字段?
请记住,我需要经常在很多课程上这样做,这就是为什么性能是相关的 。
我会凭直觉做的就是通过这个伪代码所示:
- 获取类
clazz.getFields();
- 检查的各个领域,这是注有@PostInject
eachField.getAnnotation(PostInject.class);
- 使这些字段可访问
eachAnnotatedField.setAccessible(true);
- 将它们设置为一定值
eachAnnotatedField.set(clazz, someValue);
恐怕让所有领域,是做最慢的事情。
当我从一开始就知道它时,我可以有人获得一个领域吗?
注:我不能让这些类实现一些接口,这将允许使用方法设置字段 。我需要
POJO。
注2:为什么我想要post-field注入:从API用户的角度来看,它必须可以使用final字段。此外,当API先验地不知道字段的类型和数量时,使用接口不可能实现字段初始化。
NOTE2b:从视用户的角度来看,最终的合同是不破碎。它保持最终状态。首先,一个字段被初始化,然后它不能被改变。顺便说一句:有很多API使用这个概念,其中一个是JAXB(JDK的一部分)。
我只是好奇你为什么需要这样做?这个背后有一个有趣的故事,如果有,你能分享吗? – 2009-10-28 12:10:49
我正在编写一个类似于JAXB的编组器,但更特别(因此更受限制)。带注释的POJO非常灵活。 – 2009-10-28 12:21:17
如果你要求实现者使用你的注释 - 你在这里并没有真正获得使用接口的任何东西 - 并且你没有真正使用POJO - http://en.wikipedia.org/wiki/Plain_Old_Java_Object#Contextual_variations – Nate 2009-10-28 12:50:15