zoukankan      html  css  js  c++  java
  • 自定义注释@interface的用法理解

    场景:为了理解@interface使用
    1.@interface自定义注解
    <1>@interface自定义注解自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
    <2>在定义注解时,不能继承其他的注解或接口。
    <3>使用@interface来声明一个注解,
    1>.每一个方法实际上是声明了一个配置参数,
    2>.方法的名称就是参数的名称,
    3>.返回值类型就是参数的类型,(返回值类型只能是基本类型、Class、String、enum)
    4>.可以通过default来声明参数的默认值
    2.举例说明,分别作用在类,方法,属性上的注解
    <1>.作用在属性上注解

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface FiledAnnotation {
    
        String value() default "GetFiledAnnotation";
    }

    <2>.作用在方法上注解

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface MethodAnnotation {
    
        String name() default "MethodAnnotation";
    
        String url() default "https://www.cnblogs.com";
    }

    <3>.作用在类上注解

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface TypeAnnotation {
    
        String value() default "TypeAnnotation";
    }

    <4>.使用自定义注解

    @TypeAnnotation("doWork")
    public class Worker {
    
        @FiledAnnotation("博客园")
        private String myField = "";
    
        @MethodAnnotation
        public String getDefaultInfo() {
            return "do the getDefaultInfo method";
        }
    
        @MethodAnnotation(name = "百度", url = "www.baidu.com")
        public String getDefineInfo() {
            return "do the getDefineInfo method";
        }
    }

    <5>.测试自定义注解

    public class TestAnnotation {
    
        public static void main(String[] args) throws ClassNotFoundException {
            Class cls = Class.forName("com.liuqing.annotation.Worker");
            Method[] method = cls.getMethods();
            /**判断Worker类上是否有TypeAnnotation注解*/
            boolean flag = cls.isAnnotationPresent(TypeAnnotation.class);
            /**获取Worker类上是TypeAnnotation注解值*/
            if (flag) {
                TypeAnnotation typeAnno = (TypeAnnotation) cls.getAnnotation(TypeAnnotation.class);
                System.out.println("@TypeAnnotation值:" + typeAnno.value());
            }
    
            /**方法上注解*/
            List<Method> list = new ArrayList<Method>();
            for (int i = 0; i < method.length; i++) {
                list.add(method[i]);
            }
    
            for (Method m : list) {
                MethodAnnotation methodAnno = m.getAnnotation(MethodAnnotation.class);
                if (methodAnno == null)
                    continue;
                System.out.println("方法名称:" + m.getName());
                System.out.println("方法上注解name = " + methodAnno.name());
                System.out.println("方法上注解url = " + methodAnno.url());
            }
            /**属性上注解*/
            List<Field> fieldList = new ArrayList<Field>();
            for (Field f : cls.getDeclaredFields()) {// 访问所有字段
                FiledAnnotation filedAno = f.getAnnotation(FiledAnnotation.class);
                System.out.println("属性名称:" + f.getName());
                System.out.println("属性注解值FiledAnnotation = " + filedAno.value());
            }
        }
    }

    打印结果

  • 相关阅读:
    ibatis集成封装之路(to mysql)
    设计模式第一弹—适配器模式
    markdown语法
    outlook vba开发要点
    PHP中json_encode中文编码的问题_学习
    isset、empty、var==null、is_null、var===null详细理解
    对冒泡和二分法,特别是二分法有了更深的理解
    php Socket表单提交学习一下
    php Socket模拟表单上传文件函数_学习
    java第九节 网络编程的基础知识
  • 原文地址:https://www.cnblogs.com/liuqing576598117/p/13566519.html
Copyright © 2011-2022 走看看