自定义java注解

    xiaoxiao2022-07-13  142

    java注解

    java注解java内置注解自定义注解元注解注解支持的属性

    原文章地址

    java注解

    概念:注解用于给java代码添加元数据,在编译或者运行时解析处理这些元数据。注解可用于包,类,字段,方法,参数等。可以将理解为给这些包或类等等添加一个标签。在使用框架的时候会发现各种框架都实现了自己的注解。实际上就是在类扫描的时候特殊处理这些含有注解的类或方法或字段而已。

    java内置注解

    @Override:表示当前的方法定义将覆盖父类中的方法@Deprecated:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告@SuppressWarnings:表示关闭编译器警告信息

    自定义注解

    注解也属于一种类型,就像class,interface一样,可以自定义,格式如下

    [@Target] [@Retention] [@Documented] [@Inherited] public @interface [名称] { // 元素 }

    使用注解有几个条件:注解声明、使用注解的元素、操作注解使其起作用(注解处理器)。 创建一个Bean的注解

    @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Bean { String value(); //也可以设置默认值 //String value() default "entity"; }

    测试注解

    @Bean("abc") public class AnnotationDemo { public static void main(String[] args) { AnnotationDemo a=new AnnotationDemo(); Class cls=AnnotationDemo.class; //使用反射获取注解 Bean annotation=(Bean) cls.getAnnotation(Bean.class); System.out.println(annotation.value()); } }

    输出

    abc

    元注解

    元注解就是注解其他注解的注解 在java中有4个元注解

    注解作用取值@Target设置注解可以应用的位置,比如在类上,还是方法上下文中@Retention设置注解的生存时间下文中@Document说明注解是否能被文档化无@Inhrited说明注解能否被继承无 @Target取值 ElementType.CONSTRUCTOR 可以给构造方法进行注解ElementType.FIELD 可以给属性进行注解ElementType.LOCAL_VARIABLE 可以给局部变量进行注解ElementType.METHOD 可以给方法进行注解ElementType.PACKAGE 可以给一个包进行注解ElementType.PARAMETER 可以给一个方法内的参数进行注解ElementType.ANNOTATION_TYPE 可以给一个注解进行注解ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举 Retention:取值 RetentionPolicy.SOURCE阶段(java源文件阶段)RetentionPolicy.CLASS阶段(class文件阶段)RetentionPolicy.RUNTIME阶段(内存中的字节码运行时阶段)默认是在RetentionPolicy.CLASS阶段

    此时可以明白上述Bean注解应用于类,周期是运行时期

    注解支持的属性

    所有基本数据类型(int,float,boolean,byte,double,char,long,short)String类型Class类型enum类型Annotation类型以上所有类型的数组

    代码示例:

    //如果没有@Retention(RetentionPolicy.RUNTIME),在反射时拿不到相应的值,会抛空指针异常,因为默认注解生存时间是class文件 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Bean2 { String a(); int b(); boolean c(); long[] d(); }

    测试

    @Bean2(a="aaaa",b=99,c=false,d={1,3,5,7,9}) public class AnnotationDemo2 { public static void main(String[] args) { Class cls=AnnotationDemo2.class; Bean2 bean2=(Bean2) cls.getAnnotation(Bean2.class); System.out.println(bean2.a()); System.out.println(bean2.b()); System.out.println(bean2.c()); System.out.println(Arrays.toString(bean2.d())); } }

    控制台打印

    aaaa 99 false [1, 3, 5, 7, 9]
    最新回复(0)