假設,我有很多類,它們是使用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