在skaffman的幫助下,我編寫了一個簡單的例子,說明如何在沒有setter的情況下進行注入。 也許它可以幫助(這對我做了)
//......................................................
import java.lang.annotation.*;
import java.lang.reflect.*;
//......................................................
@Target(value = {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface Inject {
}
//......................................................
class MyClass {
@Inject
private int theValue = 0;
public int getTheValue() {
return theValue;
}
} // class
//......................................................
public class Example {
//......................................................
private static void doTheInjection(MyClass u, int value) throws IllegalAccessException {
Field[] camps = u.getClass().getDeclaredFields();
System.out.println("------- fields : --------");
for (Field f : camps) {
System.out.println(" -> " + f.toString());
Annotation an = f.getAnnotation(Inject.class);
if (an != null) {
System.out.println(" found annotation: " + an.toString());
System.out.println(" injecting !");
f.setAccessible(true);
f.set(u, value);
f.setAccessible(false);
}
}
} //()
//......................................................
public static void main(String[] args) throws Exception {
MyClass u = new MyClass();
doTheInjection(u, 23);
System.out.println(u.getTheValue());
} // main()
} // class
運行輸出:
------- fields : --------
-> private int MyClass.theValue
found annotation: @Inject()
injecting !
23
這是私人的,但不是最終的。你在代碼塊中錯過了* final *嗎?因爲我認爲不可能注入私人最終成員。 (糾正我,如果我錯了。) – whiskeysierra 2010-04-05 22:02:01
@威利:你說得對。在下面的代碼示例中,我放了final,但即使doInjection()方法沒有提出錯誤,值也沒有更改。所以我刪除了最後的。 – cibercitizen1 2010-04-06 07:41:33