Java元注解和自定义注解及注解的使用
2018-02-11 14:32
363 查看
一、@Documented
@Documented注解表明这个注解会被javadoc之类工具记录,即注解类型信息也会被包括在生成文档中。默认情况下,javadoc是不包括注解的。二、@Target
@Target注解用于设定注解使用范围1.@Target(ElementType.TYPE) //接口、类、枚举、注解
2.@Target(ElementType.FIELD) //字段、枚举的常量
3.@Target(ElementType.METHOD) //方法
4.@Target(ElementType.PARAMETER) //方法参数
5.@Target(ElementType.CONSTRUCTOR) //构造函数
6.@Target(ElementType.LOCAL_VARIABLE)//局部变量
7.@Target(ElementType.ANNOTATION_TYPE)//注解
8.@Target(ElementType.package) ///包
这里可以使用多个,比如:@Target({ElementType.TYPE,ElementType.METHOD})
三、@Retention
@Retention注解表明被保留到那个阶段. 有三个值:1.RetentionPolicy.SOURCE //这种类型的Annotations只在源代码级别保留,编译时就会被忽略,如@Override注解
2.RetentionPolicy.CLASS //这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
3.RetentionPolicy.RUNTIME // 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
四、@Inherited
@Inherited定义在类级别上,子类时可以继承的,@Inherited定义在方法级别上,子类的方法如果复写的那么就不能继承。五、自定义注解
1.@Test_Cat可被javadoc记录,用于类上,可用反射机制读取
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test_Cat {
String catName() default "cat";
}
2.@Test_WhiteCat
可被javadoc记录,用于类上,可用反射机制读取
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test_WhiteCat {
String whiteCatName() default "white cat";
}
3.@Test_Dog
用于类上,可用反射机制读取,可被继承
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Test_Dog {
String dogName() default "dog";
}
4.@Test_BlackDog
用于类上,可用反射机制读取
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test_BlackDog {
String blackDogName() default "black dog";
}
六、注解的使用
AnimalFather类为父类,AnimalSon 为子类。AnimalSon类继承AnimalFather类@Test_Cat //不可被继承
@Test_Dog //可被继承
class AnimalFather{
}
@Test_WhiteCat
@Test_BlackDog
class AnimalSon extends AnimalFather{
}
七、测试
public class TestMain {public static void main(String[] args) {
//反射获得AnimalSon
Class<AnimalSon> clazz = AnimalSon.class;
System.out.println("- - - - - - Annotation - - - - - -");
for (Annotation annotation : clazz.getAnnotations()) {
System.out.println(annotation);
}
System.out.println("- - - - - - Annotation Method - - - - - -");
//如果有Test_Cat注解
if (clazz.isAnnotationPresent(Test_Cat.class)) {
Test_Cat cat = clazz.getAnnotation(Test_Cat.class);
System.out.println(cat.catName());
}
//如果有Test_Dog注解
if (clazz.isAnnotationPresent(Test_Dog.class)) {
Test_Dog dog = clazz.getAnnotation(Test_Dog.class);
System.out.println(dog.dogName());
}
//如果有Test_WhiteCat注解
if (clazz.isAnnotationPresent(Test_WhiteCat.class)) {
Test_WhiteCat whiteCat = clazz.getAnnotation(Test_WhiteCat.class);
System.out.println(whiteCat.whiteCatName());
}
//如果有Test_BlackDog注解
if (clazz.isAnnotationPresent(Test_BlackDog.class)) {
Test_BlackDog blackDog = clazz.getAnnotation(Test_BlackDog.class);
System.out.println(blackDog.blackDogName());
}
}
}
八、结果
1.生成javadoc文档后,查看@Documented注解的效果在AnimalFather文档中可以看到类上有@Test_Cat注解,无@Test_Dog注解,由此可看到@Documented注解的作用
在AnimalFather文档中可以看到类上有@Test_WhiteCat注解,无@Test_BlackDog注解
2.控制台打印出的结果
AnimalSon没有继承AnimalFather的@Test_Cat注解,继承了@Test_Dog注解,由此可看到@Inherited注解的用法
九、源码
github源码gitee源码
相关文章推荐
- java元注解和自定义注解的使用方法
- Android开发技巧之使用自定义注解
- 使用动态代理+自定义注解控制数据库事务
- 使用自定义注解+Spring AOP 实现日志记录
- SpringBoot使用自定义注解+拦截器 实现日志记录
- 使用Spring AOP和自定义注解记录日志
- SpringBoot实践之(十五)---自定义注解Annotation的使用
- 使用SpringBoot通过自定义注解+AOP+全局异常处理实现参数统一非空校验
- 如何创建、使用以及解析自定义注解
- spring mvc使用自定义注解控制访问权限
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
- 在spring 中使用自定义注解
- 使用自定义注解来验证属性是否规范
- 使用自定义注解和切面记录系统日志
- Eclipse使用技巧 - 自定义JavaDoc注解和代码模版,提升开发效率和规范性 推荐
- SpringMVC使用自定义注解的方式实现session检查
- 【Spring】 (1)Aspect 自定义注解 使用该注解的地方 自动注入该注解里传的参数
- 切面和自定义注解的配合使用
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
- 详解使用Spring AOP和自定义注解进行参数检查