java max 注解自定义 java注解如何生效_如何查看注解实现


在上一讲《Java语言编程第37讲——Java注解入门》中,介绍了一些Java注解的概念。写完之后,出于对Spring的景仰,特别想自己实现一个属性值注入的功能,这是以前从未做过的事情。

下面使用IDEA作为开发工具,一边编写程序一边写文章,尝试实现这样的功能,包括注解的定义、使用,以及如何使得注解生效,并把详细过程记录下来,如果你有兴趣,完全可以自己对着做一遍。

第1步:启动IDEA软件;

第2步:新建一个模块,选择项目类型为Maven:


java max 注解自定义 java注解如何生效_注解设置 实体值_02


第3步:点击Next按钮,ArtifactId填入my_at:


java max 注解自定义 java注解如何生效_notnull注解不生效_03


第4步:点击Next按钮,直接使用默认提供的信息:


java max 注解自定义 java注解如何生效_notnull注解不生效_04


第5步:点击Finish按钮,完成模块创建。

第6步:创建com.noname包:


java max 注解自定义 java注解如何生效_注解设置 实体值_05


第7步:在com.noname包中新建一个接口FlyingInject:


java max 注解自定义 java注解如何生效_jsonfield注解不生效_06


第8步:完成FlyingInject接口的代码编写。FlyingInject接口是一个注解,用于对数据成员进行注解,并且在运行时生效,下面是具体代码:

package com.noname;import java.lang.annotation.*;@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface FlyingInject {    String value() default "no-value";}

第9步:在com.noname包中创建一个MyData类:


java max 注解自定义 java注解如何生效_java max 注解自定义_07


第10步:完成MyData类的代码编写。MyData类使用前面创建的FlyingInject注解,来设置数据成员的值,代码如下:

package com.noname;public class MyData {    @FlyingInject("China")    private String countryName;        @FlyingInject("Guangdong")    private String provinceName;        @FlyingInject("Shenzhen")    private String cityName;        @FlyingInject    private String theMemory;        public String getCountryName(){        return countryName;    }        public String getProvinceName(){        return provinceName;    }        public String getCityName(){        return cityName;    }        public String getTheMemory(){        return theMemory;    }}

第12步:在com.noname包中新建一个MyAt类:


java max 注解自定义 java注解如何生效_notnull注解不生效_08


第13步:完成MyAt类的代码编写。MyAt类用于让注解生效,并带有一个用于测试的main方法。MyAt类的代码如下:

package com.noname;public class MyAt {    private static MyData createInstanceOfMyData(){        MyData myData = new MyData();        Field[] fields  = myData.getClass().getFields();        for (int i=0; i

第14步:运行MyAt的main方法,程序运行结果如下:

Country is : ChinaProvince is : GuangdongCity is : ShenzhenMemory is : no-valueProcess finished with exit code 0

查看结果,实现了MyData类的数据成员值注入。第一次编写注解的程序,竟然就成功了!太开心了!!!

下面解释一下程序的实现逻辑:

1、FlyingInject是我们实现的注解,它是一个特殊的接口,它只有一个数据成员value(注解的数据成员以方法的形式提供),如果注解的数据成员名为value,则使用注解给这个成员赋值时,不需要指定成员的名字;

2、FlyingInject注解的value数据成员有一个缺省值“no-value”,如果使用该注解时不提供值,则使用这个缺省的值“no-value”;

3、MyData类是一个使用了FlyingInject注解的普通类,它有四个数据成员,都是用FlyingInject注解设置数据成员的值;

4、MyAt类的createInstanceOfMyData是整个程序的核心方法,它查找MyData类的所有数据成员,如果该数据成员使用了FlyingInject注解,则用注解的值设置数据成员。

以为这样的程序很复杂,没想到实现也挺容易的。文章写到这里就结束了,如果文章中有什么错误,欢迎私信或直接指出。谢谢你的耐心阅读!