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