美文网首页
浅谈 Java 自定义注解

浅谈 Java 自定义注解

作者: 三分灰 | 来源:发表于2018-09-08 15:59 被阅读25次

    刚学了 Java 自定义注解,写篇文章来记录一下,加深一下印象

    首先来看一个简单的自定义注解类 MyAnno.java

    package com.test.x;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface MyAnno {
        String name();
        int age() default 10;
    } 
    

    @interface 用来表示这是一个注解

    首先来看这个注解的上半部分,上面的四个注解称为 元注解

    • @Target({ElementType.METHOD,ElementType.TYPE}) 表示该注解的作用域,这里表示作用于 方法类或接口
    • @Retention(RetentionPolicy.RUNTIME) 表示该注解的生命周期,一般都是 RUNTIME
    • @Inherited 表示该注解可被继承(当一个子类继承一个有注解的父类时,子类会继承该父类的注解)
    • @Documented 表示生成的 javadoc 中包含该注解

    再看注解类里面的内容

    nameage 都是这个注解类的成员,注解类的成员必须是 无参且不抛异常的 ,但可以有 默认值
    当注解类只有一个成员时,成员名必须为 value


    接下来看看自定义注解的使用

    这是一个简单的 Java 类,在该类中使用了自定义的注解

    package com.test.x;
    
    @MyAnno(name="Tom")
    public class User {
        
        @MyAnno(name="Tom Smith",age=12)
        public void info() {
            
        }
    
    }
    

    接下来要获取注解的值,包括类上的和方法上的

    package com.test.x;
    
    import java.lang.reflect.Method;
    
    import com.test.Description;
    
    public class Main {
    
        public static void main(String[] args) {
            //
            User user = new User();
            //得到Class
            Class c = user.getClass();
            //判断类上有没有使用该注解
            boolean exists = c.isAnnotationPresent(MyAnno.class);
            if(exists) {
                //获取类上面的注解
                MyAnno anno = (MyAnno)c.getAnnotation(MyAnno.class);
                System.out.println(anno.age());
                System.out.println(anno.name());
            }
            //获取方法上面的注解
            Method[] ms = c.getMethods();
            for(Method m : ms) {
                boolean mExist = m.isAnnotationPresent(MyAnno.class);
                if(mExist) {
                    MyAnno manno = (MyAnno)m.getAnnotation(MyAnno.class);
                    System.out.println(manno.name());
                    System.out.println(manno.age());
                }
            }
        }
    
    }
    

    这就是一个简单的自定义注解示例了。

    相关文章

      网友评论

          本文标题:浅谈 Java 自定义注解

          本文链接:https://www.haomeiwen.com/subject/qyxlgftx.html