java魔法堂_Java魔法堂:自定义和解析注解

一、前言

注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然我们也可以按需求自定义一些注解,然后对其进行解析获取元数据,进而实现通过代码生成代码的操作。

二、自定义注解

只需通过 关键字@interface 即可自定义注解

//标识注解(就是无属性的注解)

public@interface AnnotationWithoutProperty{

}//带value属性的注解

public@interface AnnotationWithVal{

String value();

}//带myVal属性的注解

public@interface AnnotationWithMyVal{

String[] myValue();

}//带value和myVal属性的注解

public@interface AnnotationWith2Val{

String value();

String[] myValue();

}//带缺省值的myVal属性的注解

public@interface AnnotationWithDefaultVal{

String myVal()default "hello world!";

}

使用方式如下:

@AnnotationWithoutProperty

@AnnotationWithVal("hello world") //value属性赋值时,不用显式写出属性名

@AnnotationWithMyVal(myValue={"hello", "world"}) //其他属性赋值时,必须显示写出属性名

@AnnotationWith2Val(value="hello world", myVal={"hello", "world"})

@AnnotationWithDefaultVal//属性拥有缺省值时,不必显示设置属性值

@AnnotationWithDefaultVal("new value")public void test(){}

三、注解的注解

注解的注解就是为注解本身提供额外的信息,从而约束或增强注解的能力。其中包含有 @Documented 、 @Inherited 、 @Target 、 Retention 4种注解。

@Target注解:用于约束被描述的注解的使用范围,当被描述的注解超出使用范围则编译失败。

//约束@MyAnnotation的作用范围是函数和构造函数

@Target(ElementType.METHOD, ElementType.CONSTRUCTOR)public @interface MyAnnotation{}

@Retention注解:用于约束被描述的注解的作用范围,注解的作用范围有三个,分别为

1.  RetentionPolicy.SOURCE,作用范围为源码,就是仅存在于java文件中,当执行 javac 命令时将会去除该注解。

2.  RetentionPolicy.CLASS,作用范围为二进制码,就是存在于class文件中,当执行 java 命令时会去除该注解。

3.  RetentionPolicy.RUNTIME,作用范围为运行时,就是我们可以通过反射动态获取该注解。

@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotation{}

@Documented注解 :用于指定javadoc生成API文档时显示该注解信息

@Inherited注解 :用于指定被描述的注解可以被其所描述的类的子类继承。默认情况

//默认注解不会被子类继承

@MyAnnotationpublic classParent{}//Son并没有继承注解MyAnnotation

public class Son extends Parent{}

通过 @Inherited 子类将会继承父类的 @MyAnnoation注解 。

四、读取注解

通过反射我们可以获取类、函数等上的注解信息。

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.CLASS)

@Documentedpublic@interface MyAnnotaion{

String value()default "hello world";

}

@MyAnnotationpublic classTest{public static voidmain(String[] args){

MyAnnotation ma= Test.class.getAnnotation(MyAnnotation.class);

System.out.println(ma.value());//获取自身和从父类继承的注解

Annotation[] annotations = Test.class.getAnnotations();//仅获取自身的注解

Annotation[] annotations = Test.class.getDeclaredAnnotations();}

}

五、参考

http://www.cnblogs.com/liubiqu/archive/2008/06/01/1211503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值