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());
            }
        }
    }

    打印结果

  • 相关阅读:
    BZOJ 1391: [Ceoi2008]order
    BZOJ 4504: K个串
    2019 年百度之星·程序设计大赛
    POJ 2398 Toy Storage (二分 叉积)
    POJ 2318 TOYS (二分 叉积)
    HDU 6697 Closest Pair of Segments (计算几何 暴力)
    HDU 6695 Welcome Party (贪心)
    HDU 6693 Valentine's Day (概率)
    HDU 6590 Code (判断凸包相交)
    POJ 3805 Separate Points (判断凸包相交)
  • 原文地址:https://www.cnblogs.com/liuqing576598117/p/13566519.html
Copyright © 2011-2022 走看看