您的位置:首页 > 编程语言 > Java开发

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源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息