Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性。在如今各种框架及开发中非常常见,特此说明一下。
如何创建一个注解
每一个自定义的注解都由四个元注解组成,这四个元注解由java本身提供:
@Target(ElementType.**)
这是一个枚举,它置顶是该自定义的注解使用的地方,像类、变量、方法,参数等
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
@Retention(RetentionPolicy.**)作用是标明注解保存在什么级别,像在编译时、class文件中,vm运行中。
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同
@Inherited : (可以不写,标识是否继承父类注解)在您定义注解后并使用于程序代码上时,预设上父类别中的注解并不会被继承至子类别中,您可以在定义注解时加上java.lang.annotation.Inherited 限定的Annotation,这让您定义的Annotation型别被继承下来。
代码呈现:
1.定义一个注解
package com.tjbsl.myAnnotation;
import java.lang.annotation.*;
/**
* @author tjbsl
*/
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Tjbsl {
String name() default "";
}
2.引用注解
package com.tjbsl.myAnnotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TjbslTest {
public static void main(String[] args) {
try {
Method doSoming = TjbslTest.class.getMethod("doSoming");
TjbslTest instance = TjbslTest.class.newInstance();
//执行反射
doSoming.invoke(instance,null);//execute doSoming
//判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
if(doSoming.isAnnotationPresent(Tjbsl.class)){
//执行注解
System.out.println("注解:"+doSoming.getAnnotation(Tjbsl.class));//@com.tjbsl.myAnnotation.Tjbsl()
Tjbsl annotation = doSoming.getAnnotation(Tjbsl.class);
System.out.println("注解name:"+annotation.name());
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
@Tjbsl(name = "zhangsanfeng")
public void doSoming(){
System.out.println("execute doSoming");
}
}
3.引用升级版-web项目中,对使用注解的类打印执行时间
在Intercepter中进行调用注解方法判断,实现此注解的方法,操作打印执行时间等..TODO