最近有点郁闷,因为好像很多公司都已经开始使用spring注解来代替xml的配置方式使用spring。但是我以前从来没有用过注解,虽然前些日子也看了spring的注解,但是对于其实现原理还没明白,因此在这里通过一个注解的例子来让大家理解注解是如何工作的。当然spring的注解还参杂了反射,本例子中没有用到反射,有意向的可以自己去看看。
java中的注解常用的有两个类型,一个时Retention,另一个是Target:
Retention是指明注解会在代码的哪一个阶段被丢弃,它有三个选择:
RetentionPolicy.SOURCE 注解在编译期被丢弃
RetentionPolicy.CLASS 注解存在于类文件中,但是在载入VM中时会被丢弃,这是Retention的默认行为
RetentionPolicy.RUNTIME 使用这个选项,则注解存在于类文件以及VM中,这样就可以通过反射获取到注解
Target是指明你的注解是用于类,方法,变量,构造器,当然这是可以都选择:
/** Class, interface (including annotation type), or enum declaration */
ElementType.TYPE 用于类,接口
/** Field declaration (includes enum constants) */
ElementType.FIELD 用于类变量
/** Method declaration */
ElementType. METHOD 用于类方法
/** Parameter declaration */
ElementType.PARAMETER 用于参数
/** Constructor declaration */
ElementType.CONSTRUCTOR 用于构造器
/** Local variable declaration */
ElementType.LOCAL_VARIABLE 用于本地变量
/** Annotation type declaration */
ElementType.ANNOTATION_TYPE 用于注解
/** Package declaration */
ElementType.PACKAGE 用于包
接下来再看看例子:
首先定义一个注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface TestAnnotation {
String test1();
String testDefault() default "厨子出现";
int[] testArray() default {1,2,3};
}
再来运用这个定义的注解:
@TestAnnotation(test1="这是test1", testDefault="这是testDefault", testArray={5,6,7})
public class ExecuteAnnotation {
/**
* @param args
*/
public static void main(String[] args) {
if(ExecuteAnnotation.class.isAnnotationPresent(TestAnnotation.class)) {
TestAnnotation ta = (TestAnnotation) ExecuteAnnotation.class.getAnnotation(TestAnnotation.class);
System.out.println(ta);
System.out.println(ta.test1() + ", " + ta.testDefault());
for(int i =0; i < ta.testArray().length; i++) {
System.out.println("array===" + ta.testArray()[i]);
}
}
}
}