美文网首页
自定义注解的使用Annotation

自定义注解的使用Annotation

作者: 陈萍儿Candy | 来源:发表于2021-01-06 21:01 被阅读0次

自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
public @interface TestAnnotation {

    String name();

    int getCode() default 0;
}

在Person类中使用上面注解

@TestAnnotation(name = "00",getCode = 0)
public class Person {
    
    private String TAG = "Person";

    @TestAnnotation(name = "123")
    public String name;
    
    @TestAnnotation(name = "4", getCode = 4)
    public void gotoWork(int time) {
        Log.i(TAG, "gotoWork: ");
    }
}

解析注解的代码

class AnnotationMain {
    public static void main(String[] args) {
        Person person = new Person();
        Class<? extends Person> aClass = person.getClass();
        // aClass对应的类是否被注解
        if (aClass.isAnnotationPresent(TestAnnotation.class)) {
            // 获取指定的注解
            TestAnnotation annotation = aClass.getAnnotation(TestAnnotation.class);
            System.out.println("jieguo:" + annotation.name() + "," + annotation.getCode());
        }
        // 获取方法上的注解
        try {
            Class<?> personClass = Class.forName("annotation.Person");
            Method gotoWork = personClass.getMethod("gotoWork", int.class);
            if (gotoWork.isAnnotationPresent(TestAnnotation.class)) {
                TestAnnotation annotation = gotoWork.getAnnotation(TestAnnotation.class);
                System.out.println("method:" + annotation.name() + "," + annotation.getCode());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        // 属性上的注解
        Class<?> aClass1 = null;
        try {
            aClass1 = Class.forName("annotation.Person");
        // name 在person中是public 修饰的属性,可以用aClass1.getField("name");
       // 如果name不是用public修饰的,需要用getDeclaredField,他可以获取person中的所有的属性,找到name
            Field name = aClass1.getField("name");
            if (name.isAnnotationPresent(TestAnnotation.class)) {
                TestAnnotation annotation = name.getAnnotation(TestAnnotation.class);
                System.out.println("feild:" + annotation.name() + "," + annotation.getCode());
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (NoSuchFieldException ex) {
            ex.printStackTrace();
        }

    }
}

一,注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。

  • 修饰符
    访问修饰符必须为public,不写默认为pubic;
  • 关键字
    关键字为@interface;
    在底层实现上,所有定义的注解都会自动继承java.lang.annotation.Annotation接口。
    二,元注解
    @Retention
    表明该注解的生命周期
    生命周期类型 描述
    RetentionPolicy.SOURCE 编译时被丢弃,不包含在类文件中
    RetentionPolicy.CLASS JVM加载时被丢弃,包含在类文件中,默认值
    RetentionPolicy.RUNTIME 由JVM 加载,包含在类文件中,在运行时可以被获取到

@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解

public @interface CherryAnnotation {
public String name();
int age() default 18;
int[] array();
}

注解里面定义的是:注解类型元素!
定义注解类型元素时需要注意如下几点:

  • 访问修饰符必须为public,不写默认为public;
  • 该元素的类型只能是基本数据类型、String、Class、枚举类型、注解类型(体现了注解的嵌套效果)以及上述类型的一位数组;
  • 该元素的名称一般定义为名词,如果注解中只有一个元素,请把名字起为value(后面使用会带来便利操作);
  • ()不是定义方法参数的地方,也不能在括号中定义任何参数,仅仅只是一个特殊的语法;
  • default代表默认值,值必须和第2点定义的类型一致;
  • 如果没有默认值,代表后续使用注解时必须给该类型元素赋值。

看到了一个非常详细的注解的讲解,我就不再写了:https://blog.csdn.net/xsp_happyboy/article/details/80987484

三,注解需要掌握的基本方法
1.放射:Class.forName("annotation.Person");
2.personClass.getMethod,通过反射获取Method
3.getDeclaredField("name")/getField("name"),获取属性Field
4.getAnnotation(TestAnnotation.class);获取指定的注解
5.getAnnotations();获取该类/方法/属性上的所有的注解

相关文章

  • springMVC的自定义annotation(@Retenti

    自定义注解: 使用@interface自定义注解时,自动继承了java.lang.annotation.Annot...

  • 自定义注解

    使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口...

  • @interface自定义注解的语法

    自定义注解:使用@interface自定义注解时,自动继承了java.lang.annotation接口,由编译程...

  • 初识java Annotation

    关于java Annotation什么是注解(Annotation) 注解的组成 自定义注解的语法以及定义形式 使...

  • (1)自定义注解

    元注解 java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用...

  • java基础之自定义注解

    注解Annotation实现原理与自定义注解例子

  • java自定义注解

    深入理解Java:注解(Annotation)自定义注解入门 要深入学习注解,我们就必须能定义自己的注解,并使用注...

  • 自定义注解的实现和使用

    自定义注解的实现和使用 自定义注解都默认实现Annotation接口,修饰符必须是要public或缺省(为包权限)...

  • 自定义注解@interface

    一、简述 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotat...

  • 画个图,玩一下注解

    参考《深入理解Java:注解(Annotation)自定义注解入门》

网友评论

      本文标题:自定义注解的使用Annotation

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