1. 首页
  2. IT资讯

一起来学 Java 注解 (Annotation)

“u003Cpu003E技术博文,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FReU3KFWHGbeY5a” img_width=”535″ img_height=”10″ alt=”一起来学 Java 注解 (Annotation)” inline=”0″u003Eu003Cpu003E作者 | 工匠初心u003Cu002Fpu003Eu003Cpu003E链接 | blog.csdn.netu002Ffengdongsuiu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003Exiu003Cu002Fiu003Enu003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E上一篇 u003Cu002Fstrongu003E从零搭建创业公司后台技术栈u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E一. 什么是Annotationu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E我们在平时的开发过程中看到很多如@Override,@SuppressWarnings,@Test等样式的代码就是注解,注解是放到类、构造器、方法、属性、参数前的标记。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E二. Annotation的作用u003Cu002Fh1u003Eu003Cpu003E给某个类、方法…添加了一个注解,这个环节仅仅是做了一个标记,对代码本身并不会造成任何影响,需要后续环节的配合,需要其他方法对该注解赋予业务逻辑处理。就如同我们在u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E微信u003Cu002Fiu003E上发了一个共享定位,此时并没有什么用,只有当后面其他人都进入了这个共享定位,大家之间的距离才能明确,才知道该怎么聚在一起。u003Cu002Fpu003Eu003Cpu003E注解分为三类:u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E2.1 编译器使用到的注解u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E如@Override,@SuppressWarnings都是编译器使用到的注解,作用是告诉编译器一些事情,而不会进入编译后的.class文件。u003Cu002Fpu003Eu003Cpu003E@Override:告诉编译器检查一下是否重写了父类的方法;u003Cu002Fpu003Eu003Cpu003E@SuppressWarnings:告诉编译器忽略该段代码产生的警告;u003Cu002Fpu003Eu003Cpu003E对于开发人员来说,都是直接使用,无需进行其他操作u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E2.2 .class文件使用到的注解u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E需要通过工具对.class字节码文件进行修改的一些注解,某些工具会在类加载的时候,动态修改用某注解标注的.class文件,从而实现一些特殊的功能,一次性处理完成后,并不会存在于内存中,都是非常底层的工具库、框架会使用,对于开发人员来说,一般不会涉及到。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E2.3 运行期读取的注解u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E一直存在于JVM中,在运行期间可以读取的注解,也是最常用的注解,如Spring的@Controller,@Service,@Repository,@AutoWired,Mybatis的@Mapper,Junit的@Test等,这类注解很多都是工具框架自定义在运行期间发挥特殊作用的注解,一般开发人员也可以自定义这类注解。u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E微信u003Cu002Fiu003E搜索 web_resource u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E关注u003Cu002Fiu003E获取更多推送u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E三. 定义Annotationu003Cu002Fh1u003Eu003Cpu003E我们使用@interface来定义一个注解u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Epublic @interface Table {u003Cu002Fcodeu003Eu003Ccodeu003E String value default “”;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpreu003Eu003Ccodeu003Epublic @interface Colum {u003Cu002Fcodeu003Eu003Ccodeu003E String value default “”;u003Cu002Fcodeu003Eu003Ccodeu003E String name default “”;u003Cu002Fcodeu003Eu003Ccodeu003E String dictType default “”;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E这样就简单地将一个注解定义好了u003Cu002Fpu003Eu003Cpu003E我们上面定义的注解主要用到了String类型,但实际上还可以是基本数据类型(不能为包装类)、枚举类型。u003Cu002Fpu003Eu003Cpu003E注解也有一个约定俗成的东西,最常用的参数应该命名为value,同时一般情况下我们都会通过default参数设置一个默认值。u003Cu002Fpu003Eu003Cpu003E但这样是不是就满足于我们的使用了呢,我想把u003Ccodeu003E@Tableu003Cu002Fcodeu003E注解仅用于类上,u003Ccodeu003E@Columu003Cu002Fcodeu003E注解仅用于属性上,怎么办?而且开始提到的三类注解,一般开发人员用的都是运行期的注解,那我们定义的是吗?u003Cu002Fpu003Eu003Cpu003E要回答这些问题,就需要引入一个概念“元注解”。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E3.1 元注解u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E可以修饰注解的注解即为元注解,Java已经定义了一些元注解,我们可以直接使用。u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E微信u003Cu002Fiu003E搜索 web_resource u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E关注u003Cu002Fiu003E获取更多推送u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrongu003E3.1.1 @Targetu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E顾名思义指定注解使用的目标对象,参数为ElementTypeu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Epublic @interface Target {u003Cu002Fcodeu003Eu003Ccodeu003E u002F**u003Cu002Fcodeu003Eu003Ccodeu003E * Returns an array of the kinds of elements an annotation typeu003Cu002Fcodeu003Eu003Ccodeu003E * can be applied to.u003Cu002Fcodeu003Eu003Ccodeu003E * @return an array of the kinds of elements an annotation typeu003Cu002Fcodeu003Eu003Ccodeu003E * can be applied tou003Cu002Fcodeu003Eu003Ccodeu003E *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E ElementType value;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E而下面是ElementType枚举中定义的属性,不设置Target的时候,除了TYPE_PARAMETER,TYPE_USE,其他地方都相当于配置上了。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Epublic enum ElementType {u003Cu002Fcodeu003Eu003Ccodeu003E u002F** 通过ElementType.TYPE可以修饰类、接口、枚举 *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E TYPE,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F** 通过ElementType.FIELD可以修饰类属性 *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E FIELD,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F** 通过ElementType.METHOD可以修饰方法 *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E METHOD,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F** 通过ElementType.PARAMETER可以修饰参数(如构造器或者方法中的) *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E PARAMETER,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F** 通过ElementType.CONSTRUCTOR可以修改构造器 *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E CONSTRUCTOR,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F** 通过ElementType.LOCAL_VARIABLE可以修饰方法内部的局部变量 *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E LOCAL_VARIABLE,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F** 通过ElementType.ANNOTATION_TYPE可以修饰注解 *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E ANNOTATION_TYPE,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F** 通过ElementType.PACKAGE可以修饰包 *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E PACKAGE,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F**u003Cu002Fcodeu003Eu003Ccodeu003E * 可以用在Type的声明式前u003Cu002Fcodeu003Eu003Ccodeu003E *u003Cu002Fcodeu003Eu003Ccodeu003E * @since 1.8u003Cu002Fcodeu003Eu003Ccodeu003E *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E TYPE_PARAMETER,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F**u003Cu002Fcodeu003Eu003Ccodeu003E * 可以用在所有使用Type的地方(如泛型、类型转换等)u003Cu002Fcodeu003Eu003Ccodeu003E *u003Cu002Fcodeu003Eu003Ccodeu003E * @since 1.8u003Cu002Fcodeu003Eu003Ccodeu003E *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E TYPE_USEu003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E我们主要说一下ElementType.PACKAGE和1.8添加的ElementType.TYPE_PARAMETER和ElementType.TYPE_USEu003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003EElementType.PACKAGEu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@Target(ElementType.PACKAGE)u003Cu002Fcodeu003Eu003Ccodeu003Epublic @interface Table {u003Cu002Fcodeu003Eu003Ccodeu003E String value default “”;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E含义是用来修饰包,但我们用来修饰包的时候却提示错误u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FReZhKEH6uCY5Yd” img_width=”953″ img_height=”278″ alt=”一起来学 Java 注解 (Annotation)” inline=”0″u003Eu003Cpu003E我们按照提示创建package-info.java文件,这里需要注意一下,通过IDE 进行new –> Java Class是创建不了的,需要通过new File文件创建u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@Tableu003Cu002Fcodeu003Eu003Ccodeu003Epackage annotation;u003Cu002Fcodeu003Eu003Ccodeu003Eclass PackageInfo {u003Cu002Fcodeu003Eu003Ccodeu003E public void hello {u003Cu002Fcodeu003Eu003Ccodeu003E System.out.println(“hello”);u003Cu002Fcodeu003Eu003Ccodeu003E }u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FReZhKEUEKwVSyF” img_width=”1080″ img_height=”371″ alt=”一起来学 Java 注解 (Annotation)” inline=”0″u003Eu003Cpu003Eu003Cstrongu003EElementType.TYPE_PARAMETER和ElementType.TYPE_USEu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E这两个一起说,因为它们有相似之处。都是Java1.8后添加的u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@Target(ElementType.TYPE_USE)u003Cu002Fcodeu003Eu003Ccodeu003Epublic @interface NoneEmpty {u003Cu002Fcodeu003Eu003Ccodeu003E String value default “”;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003E@Target(ElementType.TYPE_PARAMETER)u003Cu002Fcodeu003Eu003Ccodeu003Epublic @interface NoneBlank {u003Cu002Fcodeu003Eu003Ccodeu003E String value default “”;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FReZhKEx8lyTRh1″ img_width=”940″ img_height=”566″ alt=”一起来学 Java 注解 (Annotation)” inline=”0″u003Eu003Cpu003E很明显使用ElementType.TYPE_PARMETER修饰的注解@NoneBlank无法在泛型使用的时候编译通过,仅能用于类的泛型声明,而通过ElementType.TYPE_USE修饰的注解@NoneEmpty可以。u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E微信u003Cu002Fiu003E搜索 web_resource u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E关注u003Cu002Fiu003E获取更多推送u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrongu003E3.1.2 @Retentionu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E可以用于定义注解的生命周期,参数为枚举RetentionPolicy,包括了SOURCE,CLASS,RUNTIMEu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@Retention(RetentionPolicy.RUNTIME)u003Cu002Fcodeu003Eu003Ccodeu003E@Target(ElementType.ANNOTATION_TYPE)u003Cu002Fcodeu003Eu003Ccodeu003Epublic @interface Retention {u003Cu002Fcodeu003Eu003Ccodeu003E u002F**u003Cu002Fcodeu003Eu003Ccodeu003E * Returns the retention policy.u003Cu002Fcodeu003Eu003Ccodeu003E * @return the retention policyu003Cu002Fcodeu003Eu003Ccodeu003E *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E RetentionPolicy value;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpreu003Eu003Ccodeu003Epublic enum RetentionPolicy {u003Cu002Fcodeu003Eu003Ccodeu003E u002F**u003Cu002Fcodeu003Eu003Ccodeu003E * 仅存在于源代码中,编译阶段会被丢弃,不会包含于class字节码文件中.u003Cu002Fcodeu003Eu003Ccodeu003E *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E SOURCE,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F**u003Cu002Fcodeu003Eu003Ccodeu003E * 【默认策略】,在class字节码文件中存在,在类加载的时被丢弃,运行时无法获取到u003Cu002Fcodeu003Eu003Ccodeu003E *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E CLASS,u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002F**u003Cu002Fcodeu003Eu003Ccodeu003E * 始终不会丢弃,可以使用反射获得该注解的信息。自定义的注解最常用的使用方式。u003Cu002Fcodeu003Eu003Ccodeu003E *u002Fu003Cu002Fcodeu003Eu003Ccodeu003E RUNTIMEu003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrongu003E3.1.3 @Documentedu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E表示是否将此注解的相关信息添加到javadoc文档中u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrongu003E3.1.4 @Inheritedu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E定义该注解和子类的关系,使用此注解声明出来的自定义注解,在使用在类上面时,子类会自动继承此注解,否则,子类不会继承此注解。注意,使用@Inherited声明出来的注解,只有在类上使用时才会有效,对方法,属性等其他无效。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@Target(ElementType.TYPE)u003Cu002Fcodeu003Eu003Ccodeu003E@Retention(RetentionPolicy.RUNTIME)u003Cu002Fcodeu003Eu003Ccodeu003E@Inheritedu003Cu002Fcodeu003Eu003Ccodeu003Epublic @interface Person {u003Cu002Fcodeu003Eu003Ccodeu003E String value default “man”;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpreu003Eu003Ccodeu003E@Personu003Cu002Fcodeu003Eu003Ccodeu003Epublic class Parent {u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Ccodeu003Eu002Fu002F子类也拥有@Person注解u003Cu002Fcodeu003Eu003Ccodeu003Eclass Son extends Parent {u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E3.2 定义注解小结u003Cu002Fh2u003Eu003Cpu003E用@interface定义注解u003Cu002Fpu003Eu003Cpu003E可以添加多个参数,核心参数按约定用value,为每个参数可以设置默认值,参数类型包括基本类型、String和枚举u003Cu002Fpu003Eu003Cpu003E可以使用元注解来修饰注解,元注解包括多个,必须设置u003Ccodeu003E@Targetu003Cu002Fcodeu003E和u003Ccodeu003E@Retentionu003Cu002Fcodeu003E,u003Ccodeu003E@Retentionu003Cu002Fcodeu003E一般设置为u003Ccodeu003ERUNTIMEu003Cu002Fcodeu003E。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E四. Annotation处理u003Cu002Fh1u003Eu003Cpu003E我们前面已经提到光配置了注解,其实没有作用,需要通过相应的代码来实现该注解想要表达的逻辑。u003Cu002Fpu003Eu003Cpu003E注解定义后也是一种class,所有的注解都继承自u003Ccodeu003Ejava.lang.annotation.Annotationu003Cu002Fcodeu003E,因此,读取注解,需要使用反射API。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eu002Fu002F定义的注解u003Cu002Fcodeu003Eu003Ccodeu003E@Target(ElementType.FIELD)u003Cu002Fcodeu003Eu003Ccodeu003E@Retention(RetentionPolicy.RUNTIME)u003Cu002Fcodeu003Eu003Ccodeu003Epublic @interface Colum {u003Cu002Fcodeu003Eu003Ccodeu003E String value default “”;u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F用于表示某个属性代表的中文含义u003Cu002Fcodeu003Eu003Ccodeu003E String name default “”;u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E用注解@Colum来修饰某个类的属性u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Epublic class Person {u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E @Colum(name = “姓名”)u003Cu002Fcodeu003Eu003Ccodeu003E private String name;u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E @Colum(name = “性别”)u003Cu002Fcodeu003Eu003Ccodeu003E private String gender;u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E @Colum(name = “年龄”)u003Cu002Fcodeu003Eu003Ccodeu003E private int age;u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E @Colum(name = “住址”)u003Cu002Fcodeu003Eu003Ccodeu003E private String au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eress;u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E public String getName {return name;}u003Cu002Fcodeu003Eu003Ccodeu003E public void setName(String name) {this.name = name;}u003Cu002Fcodeu003Eu003Ccodeu003E public String getGender {return gender;}u003Cu002Fcodeu003Eu003Ccodeu003E public void setGender(String gender) {this.gender = gender;}u003Cu002Fcodeu003Eu003Ccodeu003E public int getAge {return age;}u003Cu002Fcodeu003Eu003Ccodeu003E public void setAge(int age) {this.age = age;}u003Cu002Fcodeu003Eu003Ccodeu003E public String getAu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eress {return au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eress;}u003Cu002Fcodeu003Eu003Ccodeu003E public void setAu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eress(String au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eress) {this.au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eress = au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eress;}u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E通过反射读取这个类的所有字段的中文含义,并保存到list中,然后打印出来u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Epublic static void main(String[] args) throws ClassNotFoundException {u003Cu002Fcodeu003Eu003Ccodeu003E List<String> columNames = new ArrayList<>;u003Cu002Fcodeu003Eu003Ccodeu003E Class clazz = Class.forName(“annotation.Person”);u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F获取Person类所有属性u003Cu002Fcodeu003Eu003Ccodeu003E Field fields = clazz.getDeclaredFields;u003Cu002Fcodeu003Eu003Ccodeu003E for (Field field : fields){u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F获取该属性的Colum注解u003Cu002Fcodeu003Eu003Ccodeu003E Colum colum = field.getAnnotation(Colum.class);u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F或者可以先判断有无该注解u003Cu002Fcodeu003Eu003Ccodeu003E field.isAnnotationPresent(Colum.class);u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F将该属性通过注解配置好的中文含义取出来放到集合中u003Cu002Fcodeu003Eu003Ccodeu003E columNames.au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E(colum.name);u003Cu002Fcodeu003Eu003Ccodeu003E }u003Cu002Fcodeu003Eu003Cbru003Eu003Ccodeu003E u002Fu002F打印集合u003Cu002Fcodeu003Eu003Ccodeu003E columNames.forEach((columName) -> System.out.println(columName));u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E结果如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E姓名u003Cu002Fcodeu003Eu003Ccodeu003E性别u003Cu002Fcodeu003Eu003Ccodeu003E年龄u003Cu002Fcodeu003Eu003Ccodeu003E住址u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E比如我们有一些常见的应用场景,需要把网站上的列表导出成excel表格,我们通过注解的方式把列名配置好,再通过反射读取实体需要导出(是否需要导出,也可通过注解配置)的每个字段的值,从而实现excel导出的组件。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E五. 总结u003Cu002Fh1u003Eu003Cpu003E本文只是抛砖引玉地讲解了注解的基本概念,注解的作用,几种元注解的功用以及使用方法,并通过一个简单的例子讲解了一下注解的处理,并不全面,文中通过Field讲解了注解的基本Api,但注解还可以修饰类、构造器、方法等,也有相对应的注解处理方法,大家可自行查一下API手册相关内容,大同小异,有不对之处,请批评指正,望共同进步,谢谢!u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E-END-u003Cu002Fpu003E”

原文始发于:一起来学 Java 注解 (Annotation)

主题测试文章,只做测试使用。发布者:℅傍ㄖ免沦陷dε鬼,转转请注明出处:http://www.cxybcw.com/17954.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code