JDK1.5 开始增加了 Annotation 功能,该功能可用于类、构造方法、成员变量、方法、参数等的声明中。该功能不影响程序运行,但是会对编译器警告等辅助工具产生影响。
一、定义一个 Annotation
- public@interface UserName {}
使用 @interface 关键字定义一个注解
二、添加成员
- public@interface UserName {
- String value();
- }
成员类型支持:String\class\primitive\enumerated\annotation,以及所列类型的数组;
三、添加默认值
- public @interface UserName{
- String value() default "default value";
- }
四、指定可注解的类型
- @Target(ElementType.Method)
- public @interface UserName{}
适用于注解在方法上,例如:
- Class Car{
- @UserName(value = "laye")
- public void drive(){}
- }
ElementType 的种类有:
五、指定注解的有效范围
- @Retention(RetentionPolicy.RUNTIME)
- public @interface UserName{}
表示在运行时有效,RetentionPolicy 可选类型如下:
六、访问注解
java.lang.reflect 包下有一个类:AccesibleObject,它时 Method\Field\Constructor 的父类,同时它又实现了 AnnotatedElement 接口。因此,Method\Field\Constructor 包含了访问注解的接口方法;
具体例子如下:
- @Target(ElementType.FIELD) // 注解类型为变量
- @Retention(RetentionPolicy.RUNTIME) // 有效范围为运行时
- public@inteface UserName { // 声明注解
- String value()
- default "no body"; // 添加成员
- }
- class Car {@UserName(value = "lay") // 注解在变量上
- public String owner; // 默认值
- public static void main(String[] args) throws Exception {
- Class c = Car.class; // 获取类类型
- Field field = c.getField("owner"); // 获取对应变量
- UserName userName = (UserName) field.getAnnotation(UserName.class); // 获取注解
- System.out.println(userName.value()); // 获取注解的成员变量
- Car car = new Car(); // 获取实例
- field.set(car, userName.value()); // 设置实例的owner变量的值
- }
- }
以上是一个访问 field 的示例,method 和 constructor 等类同这样的写法;
常用方法:
来源: http://www.bubuko.com/infodetail-2436422.html