在学习框架之后,经常会使用到注解,比如@Resource,@Table等,注解都是以@开头,下面的代码用于自己定义一个注解:
package cn.zhao.test.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value = { ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value1() default "value1";//没有default时在使用本注解的时候必须指定值 //使用本注解时不加属性名则必须有默认的value属性,仅只有一个value属性时value可省略 String value(); //使用本注解时要设置多个属性时,每个属性名都要加上,即便是value也不能省略 String field2() default "field2"; }
在java里面,使用@interface来定义一个注解,就像class、enum一样,@interface是用来声明一个注解的。而上面的@Target与@Retention也是注解,它更准确的表达是用来注解注解的注解,这种注解就叫做元注解,java里面有四个元注解,上面我用到了两个。
@Target:用于指定自己定义的注解MyAnnotation可以在类、方法、还是属性上使用。ElementType.TYPE表示MyAnnotation这个自定义注解只能在类名上使用。
@Retention表示MyAnnotation这个注解在什么时候保留,RetentionPolicy.RUNTIME表示在运行时保留,这样我们就可以在运行时通过反射获取到被MyAnnotation注解的类了,如果你写为RetentionPolicy.SOURCE,那么这个注解将只在源码期间存活,编译后的class文件就不含有这个注解了,运行时也将不能获取。
自定义注解可以有多个属性,下面时注解的使用:
package cn.zhao.test.annotations; @MyAnnotation(value="clsName",field2="f2") public class MyClass { }
好,自定义注解也定义了,在类上也加上了自己定义的注解,有啥用呢?wtf!没感觉到有啥用啊,是这样的哦:
现在我的类MyClass被自定义的注解修饰了,那么我们做的是需要通过反射技术获取到含有@MyAnnotation这个注解的类,然后再根据注解里面的属性与属性值做相应的操作,所以说,注解在日常开发中用到的是不多的,在框架里面才会经常用到。
针对上边的注解我们可以这样使用反射来操作:
package test; import java.lang.annotation.Annotation; import org.junit.Test; import cn.zhao.test.annotations.MyAnnotation; import cn.zhao.test.annotations.MyClass; /** * 注解一般配合反射来使用 * @author admin * */ public class TestAnnotation { @Test public void testAnno(){ Class clazz = MyClass.class; Annotation[] annotations = clazz.getAnnotations(); for (Annotation annotation : annotations) { MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("type name = "+clazz.getName() + "|value1 =" + myAnnotation.value1() + " | value = " + myAnnotation.value() + "|field2 = " + myAnnotation.field2()); } } }
运行结果: