在上一讲《Java语言编程第37讲——Java注解入门》中,介绍了一些Java注解的概念。写完之后,出于对Spring的景仰,特别想自己实现一个属性值注入的功能,这是以前从未做过的事情。
下面使用IDEA作为开发工具,一边编写程序一边写文章,尝试实现这样的功能,包括注解的定义、使用,以及如何使得注解生效,并把详细过程记录下来,如果你有兴趣,完全可以自己对着做一遍。
第1步:启动IDEA软件;
第2步:新建一个模块,选择项目类型为Maven:
第3步:点击Next按钮,ArtifactId填入my_at:
第4步:点击Next按钮,直接使用默认提供的信息:
第5步:点击Finish按钮,完成模块创建。
第6步:创建com.noname包:
第7步:在com.noname包中新建一个接口FlyingInject:
第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类:
第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类:
第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注解,则用注解的值设置数据成员。
以为这样的程序很复杂,没想到实现也挺容易的。文章写到这里就结束了,如果文章中有什么错误,欢迎私信或直接指出。谢谢你的耐心阅读!