怎样网站seo,wordpress wpfooter,商城网站设计制作,视频直播系统开发网站建设元注解是负责对其它注解进行说明的注解#xff0c;自定义注解时可以使用元注解。Java 5 定义了 4 个注解#xff0c;分别是 Documented、Target、Retention 和 Inherited。Java 8 又增加了 Repeatable 和 Native 两个注解。这些注解都可以在 java.lang.annotation 包中找到。…元注解是负责对其它注解进行说明的注解自定义注解时可以使用元注解。Java 5 定义了 4 个注解分别是 Documented、Target、Retention 和 Inherited。Java 8 又增加了 Repeatable 和 Native 两个注解。这些注解都可以在 java.lang.annotation 包中找到。
Documented
Documented 是一个标记注解没有成员变量。用 Documented 注解修饰的注解类会被 JavaDoc 工具提取成文档。默认情况下JavaDoc 是不包括注解的但如果声明注解时指定了 Documented就会被 JavaDoc 之类的工具处理所以注解类型信息就会被包括在生成的帮助文档中。
示例
Documented
Target({ ElementType.TYPE, ElementType.METHOD })
public interface MyDocumented {public String value() default 这是Documented注解;
}
测试类
MyDocumented
public class DocumentedTest {/*** 测试document*/MyDocumentedpublic String Test() {return 百度搜索引擎;}
}打开 Java 文件所在的目录分别输入如下两条命令行
javac MyDocumented.java DocumentedTest.java
javadoc -d doc MyDocumented.java DocumentedTest.java运行成功后打开生成的帮助文档可以看到在类和方法上都保留了 MyDocument 的注解信息。
Target
Target 注解用来指定一个注解的使用范围即被 Target 修饰的注解可以用在什么地方。Target 注解有一个成员变量value用来设置适用目标value 是 java.lang.annotation.ElementType 枚举类型的数组下表为 ElementType 常用的枚举常量。 自定义一个 MyTarget 注解使用范围为方法代码如下。
Target({ ElementType.METHOD })
public interface MyTarget {
}class Test {MyTargetString name;
}如上代码第 6 行会编译错误错误信息为
The annotation MyTarget is disallowed for this location提示此位置不允许使用注解 MyDocumentedMyTarget 不能修饰成员变量只能修饰方法。
Retention
Retention 用于描述注解的生命周期也就是该注解被保留的时间长短。Retention 注解中的成员变量value用来设置保留策略value 是 java.lang.annotation.RetentionPolicy 枚举类型RetentionPolicy 有 3 个枚举常量如下所示。 SOURCE在源文件中有效即源文件保留CLASS在 class 文件中有效即 class 保留RUNTIME在运行时有效即运行时保留生命周期大小排序为 SOURCE CLASS RUNTIME前者能使用的地方后者一定也能使用。如果需要在运行时去动态获取注解信息那只能用 RUNTIME 注解如果要在编译时进行一些预处理操作比如生成一些辅助代码如 ButterKnife就用 CLASS 注解如果只是做一些检查性的操作比如 Override 和 SuppressWarnings则可选用 SOURCE 注解。
Inherited
Inherited 是一个标记注解用来指定该注解可以被继承。使用 Inherited 注解的 Class 类表示这个注解可以被用于该 Class 类的子类。就是说如果某个类使用了被 Inherited 修饰的注解则其子类将自动具有该注解。
创建一个自定义注解代码如下
Target({ ElementType.TYPE })
Inherited
Retention(RetentionPolicy.RUNTIME)
public interface MyInherited {
}测试类代码如下
MyInherited
public class TestA {public static void main(String[] args) {System.out.println(TestA.class.getAnnotation(MyInherited.class));System.out.println(TestB.class.getAnnotation(MyInherited.class));System.out.println(TestC.class.getAnnotation(MyInherited.class));}
}class TestB extends TestA {
}class TestC extends TestB {
}运行结果为
MyInherited()
MyInherited()
MyInherited()Repeatable
Repeatable 注解是 Java 8 新增加的它允许在相同的程序元素中重复注解在需要对同一种注解多次使用时往往需要借助 Repeatable 注解。Java 8 版本以前同一个程序元素前最多只能有一个相同类型的注解如果需要在同一个元素前使用多个相同类型的注解则必须使用注解“容器”。
Java 8 之前的做法
public interface Roles {Role[] roles();
}public interface Roles {Role[] value();
}public class RoleTest {Roles(roles {Role(roleName role1), Role(roleName role2)})public String doString(){return 百度搜索引擎;}
}Java 8 之后增加了重复注解使用方式如下
public interface Roles {Role[] value();
}Repeatable(Roles.class)
public interface Role {String roleName();
}public class RoleTest {Role(roleName role1)Role(roleName role2)public String doString(){return 百度搜索引擎;}
}不同的地方是创建重复注解 Role 时加上了 Repeatable 注解指向存储注解 Roles这样在使用时就可以直接重复使用 Role 注解。从上面例子看出使用 Repeatable 注解更符合常规思维可读性强一点。
Native
使用 Native 注解修饰成员变量则表示这个变量可以被本地代码引用常常被代码生成工具使用