注解的解析

让人想犯罪 __ 提交于 2020-11-26 03:11:54

解析自定义注解

这个章节主要是学习解析一个类中的注解;包括类上,构造上,属性上,方法上的注解的信息解析。

自定义的注解

这个自定注解是运行时会被保留的注解,出现的地方没有限制,主要是方便测试。

package anotations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 自定义注解
 * Created by Administrator on 2016/11/26.
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface Controller {
    String str();
    int id() default 0;
    Class<Long> gid();
}

注解使用类

这个类主要是给注解赋值,同时对应不同的地方。

package controller;

import anotations.Controller;

/**
 * Created by Administrator on 2016/11/26.
 */
@Controller(str="class",id=1,gid=Long.class)//在类前面
public class ControllerDemo {

    @Controller(str="field",id=2,gid=Long.class)//在属性前面
    private String str;

    @Controller(str="construct",id=3,gid=Long.class)//在构造方法前面
    public ControllerDemo(){

    }
    @Controller(str="public-method",id=4,gid=Long.class)//在方法前面
    public void say(){
        System.out.println("hello world");
    }

    @Controller(str="private-method",id=5,gid=Long.class)//在方法前面
    private void say1(){
        System.out.println("hello world");
    }

    @Controller(str="protected-method",id=6,gid=Long.class)//在方法前面
     void say2(){
        System.out.println("hello world");
    }

}

###解析注解

package test.anotations;

import anotations.Controller;
import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2016/11/29.
 */
public class ControllerDemoTest {
    @Test
    public void test() throws Exception {
        Class clazz = Class.forName("controller.ControllerDemo");
        printMethod(clazz);
        printField(clazz);
        printClass(clazz);
        //打印构造器上的注解和方法、属性类似。
    }

    /**
     * 打印方法中的注解
     */
    private void printMethod(Class clazz) {
        Method[] methods = clazz.getDeclaredMethods();//获取所有方法
        for (Method method : methods) {
            //判断方法是否有注解
            boolean hasAnnotation = method.isAnnotationPresent(Controller.class);
            if(hasAnnotation){
                Controller controller = method.getAnnotation(Controller.class);
                System.out.print("method:"+method.getName());
                System.out.print("  str:"+controller.str());
                System.out.print("  id:"+controller.id());
                System.out.print("  gid:"+controller.gid());
                System.out.println();
            }
        }
    }

    /**
     * 打印所有属性注解
     * @param clazz
     */
    private void printField(Class clazz){
        Field[] fields = clazz.getDeclaredFields();//获取所有属性
        for(Field field : fields){
            boolean hasAnnotation = field.isAnnotationPresent(Controller.class);
            if(hasAnnotation){
                Controller controller = field.getAnnotation(Controller.class);
                System.out.print("field:"+field.getName());
                System.out.print("  str:"+controller.str());
                System.out.print("  id:"+controller.id());
                System.out.print("  gid:"+controller.gid());
                System.out.println();
            }
        }
    }

    /**
     * 打印类上的注解
     * @param clazz
     */
    private void printClass(Class clazz){
        Annotation[] annotations = clazz.getAnnotations();
        for(Annotation annotation : annotations){
            if(annotation instanceof Controller){
                Controller controller = (Controller)annotation;
                System.out.print("class:"+clazz.getName());
                System.out.print("  str:"+controller.str());
                System.out.print("  id:"+controller.id());
                System.out.print("  gid:"+controller.gid());
                System.out.println();
            }
        }
    }
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!