Java注解(二)运行时注解

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用,读取注解的工具叫作注解处理器。

Java提供了两种方式来处理注解:

  1. 第一种是利用运行时反射机制;

  2. 另一种是使用Java提供的API来处理编译期的注解。

本文章主要讲解使用反射机制方式的注解处理器,仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解。

下面结合例子来说明这种方式的处理方法。

Java中的反射API(如java.lang.Class、java.lang.reflect.Field等)都实现了接口java.lang.reflect.AnnotatedElement,来提供获取类、方法和域上的注解的实用方法。

1.1、定义注解

package com.alicharles.annotation;
import java.lang.annotation.*;

@Documented
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface User {
    public int id();
    public String name() default "charles";
}

定义一个User注解,方法级别的注解,运行时解析,包含id和name属性。

1.2、定义带有注解的JavaBean

package com.alicharles.bean;
import com.alicharles.annotation.User;

public class UserBean {

    @User(id = 88)
    public void getPeople(){
    }

    @User(id = 11, name = "charlesOne")
    public void one(){
    }

    @User(id = 22, name = "charlesTwo")
    public void two(){
    }

}

1.3、注解处理器

在以上工作做完后,注解没有任何意义(它没有做任何事情),下面来为RUNTIME级别的注解来编写处理器,在此编写的处理器和真实的处理器相差比较多,无通用性,仅为演示理解用。详细代码如下:

package com.alicharles.test;

import com.alicharles.annotation.User;
import java.lang.reflect.Method;

public class UserCaseTracker {
    public static void  trackerUserCase(Class<?> cl) {
        for (Method method:cl.getDeclaredMethods()) {
            User info = method.getAnnotation(User.class);
            if (info != null){
                System.out.println("The id is " + info.id());
                System.out.println("The name is " + info.name());
            }
        }
    }
}

1.4 注解测试

package com.alicharles.test;

import com.alicharles.annotation.User;
import com.alicharles.bean.UserBean;

public class Test {
    public static void main(String[] args) {
        UserCaseTracker.trackerUserCase(UserBean.class);
    }
}

输出的注解结果:

The id is 88
The name is charles
The id is 11
The name is charlesOne
The id is 22
The name is charlesTwo
文章目录
  1. 1.1、定义注解
  2. 1.2、定义带有注解的JavaBean
  3. 1.3、注解处理器
  4. 1.4 注解测试