注解分类
- Java自带的标准注解
@Override 标明重写某个方法
@Deprecated 标明某个类或方法过时
@SuppressWarnings 标明要忽略的警告 - 元注解(注解的注解)
@Retention(标明注解被保留的阶段)
@Target(标明注解使用的范围)
@Inherited(标明注解可继承)
@Documented(标明是否生成javadoc文档) - 自定义注解
注解的用途
- 生成文档,通过代码里标识的元数据生成javadoc文档。
- 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
- 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
- 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例
注解使用演示
-
定义一个可以注解在Class,interface,enum上的注解,
-
定义一个可以注解在METHOD上的注解
-
定义一个可以注解在FIELD上的注解
-
定义一个可以注解在PARAMETER上的注解
/*
* 定义一个可以注解在Class,interface,enum上的注解
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnTargetType {
/**
* 定义注解的一个元素 并给定默认值
* @return
*/
String value() default "我是定义在类接口枚举类上的注解元素value的默认值";
}
/**
* 定义一个可以注解在METHOD上的注解
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnTargetMethod {
/**
* 定义注解的一个元素 并给定默认值
* @return
*/
String value() default "我是定义在方法上的注解元素value的默认值";
}
/**
* 定义一个可以注解在FIELD上的注解
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnTargetField {
/**
* 定义注解的一个元素 并给定默认值
* @return
*/
String value() default "我是定义在字段上的注解元素value的默认值";
}
/**
* 定义一个可以注解在PARAMETER上的注解
*/
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnTargetParameter {
/**
* 定义注解的一个元素 并给定默认值
* @return
*/
String value() default "我是定义在参数上的注解元素value的默认值";
}
/**
* 测试java注解类
*/
@MyAnTargetType
public class AnnotationTest {
@MyAnTargetField
private String field = "我是字段";
@MyAnTargetMethod("测试方法")
public void test(@MyAnTargetParameter String args) {
System.out.println("参数值 === "+args);
}
public static void main(String[] args) {
// 获取类上的注解MyAnTargetType
MyAnTargetType t = AnnotationTest.class.getAnnotation(MyAnTargetType.class);
System.out.println("类上的注解值 === "+t.value());
MyAnTargetMethod tm = null;
try {
// 根据反射获取AnnotationTest类上的test方法
Method method = AnnotationTest.class.getDeclaredMethod("test",String.class);
// 获取方法上的注解MyAnTargetMethod
tm = method.getAnnotation(MyAnTargetMethod.class);
System.out.println("方法上的注解值 === "+tm.value());
// 获取方法上的所有参数注解 循环所有注解找到MyAnTargetParameter注解
Annotation[][] annotations = method.getParameterAnnotations();
for(Annotation[] tt : annotations){
for(Annotation t1:tt){
if(t1 instanceof MyAnTargetParameter){
System.out.println("参数上的注解值 === "+((MyAnTargetParameter) t1).value());
}
}
}
method.invoke(new AnnotationTest(), "改变默认参数");
// 获取AnnotationTest类上字段field的注解MyAnTargetField
MyAnTargetField fieldAn = AnnotationTest.class.getDeclaredField("field").getAnnotation(MyAnTargetField.class);
System.out.println("字段上的注解值 === "+fieldAn.value());
} catch (Exception e) {
e.printStackTrace();
}
}
}
网友评论