ejb3是javaee5的標準,他吸收了開源框架的許多優點,非常希望大家學習并應用到實際應用當中。
ejb3完全是構建于annotation之上的,我將分為幾篇討論。
這篇是自己關于注解的理解筆記
先從RetentionPolicy這個開始把,RetentionPolicy是一個枚舉,他是對于編譯器的一個聲明。
然而Annotations在編譯的過程會中記錄到類文件。
RetentionPolicy的枚舉成員一共有三個
SOURCE 編譯器要丟棄的注釋。
CLASS 編譯器將把注釋記錄在類文件中,但在運行時 VM 不需要保留注釋。
RUNTIME 編譯器將把注釋記錄在類文件中,在運行時 VM 將保留注釋,因此可以反射性地讀取。(激發注解在運行時生效)
----在這里注意一下java.lang.reflect.AnnotatedElement這個接口主要定義了獲得注解和判斷注解是否描述了某個java元素。
在說一下這兩個
Retention,Target (jdk提供的注解)
示例
Target 源碼:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
??? ElementType[] value();
}
說明:
????? 1.自己可以描述自己,ElementType 描述聲明類型(該注解可以用于哪些元素上邊)。
????? 2.這個注解是用來描述自己定義的元數據,也應該叫做元注解,然而我們定義的元數據通常是為類或者方法而聲明的。
?????
3.@Retention(RetentionPolicy.RUNTIME
)用來保證在java運行時運行注解。
其實注解就是變向的簡化java的反射以及把spring等容器ioc和aop的相關概念從往常的xml作為元數據提了一個高度聲明至類中,摒棄掉了項目
擴大時冗長的xml的配置。
一般通過類或者方法的反射調用注解的方式如下
??????????? for (Method m : Class.forName(className).getMethods()) {
?????????????? if (m.isAnnotationPresent(MyAnnotation.class)) {
????????????????? try {
???????????????????? m.invoke(null);//根據方法有無參數設置是否為null
????????????????? } catch (Throwable ex) {
???????????????????? System.out.printf("失敗");
????????????????? }
?????????????? }
概念上應注意的幾點:
1.在Annotation中,沒有默認值的成員必須有一個成員值。而如何理解默認值是如何被處理就是一個很重要的細節:annotation類型所定義的
成員默認值被存儲在class文件中,不被編譯到annotation里面。如果我們修改一個annotation類型使其成員的默認值發生了改變,這個改變對
于所有此類型的annotation中沒有明確提供成員值的成員產生影響(即修改了該成員的成員值)。即使在annotation類型使其成員的默認值被
改變后annotation從沒被重新編譯過,該類型的annotation(改變前已經被編譯的)也受到影響。
這篇基本先寫到這里,java元數據其實是很大的一塊,我只是粗略的看了一下基本的概念,用來學習ejb作一個鋪墊。關于annotation的詳情介
紹可以閱讀參考文獻中的兩篇文章。在下一章中我要介紹一下ejb中常用的annotation。
參考文獻:
?? jdk源碼
?? Java Annotation入門
http://www.matrix.org.cn/resource/article/44/44048_Java+Annotation.html
???Java Annotation手冊
http://www.matrix.org.cn/resource/article/44/44055_Java+Annotation+Reflect.html