在Java框架中,经常会使用注解,而且还可以省很多事,来了解下自定义注解。

注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响

先写一个自己的注解类

@Documented //会被javadoc命令识别
@Retention(RetentionPolicy.RUNTIME) //相当于作用时期,比如:运行期、编译期
@Target({ElementType.METHOD}) //相当于作用域,比如方法、类
public @interface MyValue { String value();
//也可以这么写,就是说,它的默认值是hello
//String value() default "hello"; }

然后解析上边用到的那两个类:

public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE
}

可以看到,是两个枚举类,也就是我们自定义的注解有一定的时间和空间作用域。

好了,我们的自定义注解已经完成了(对的,自定义注解就上边那一段代码),那我们就来看看要怎么有用呢?很容易啊,就和其他的注解一样,写在我们要用到的地方就好了。(对的,我确定不是在开玩笑)

public class Person {

    @MyValue(value="张三")
private String name; /*
为什么要写setter和getter,很快你就会知道
*/
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

然后我们在其他地方去拿

Person person = new Person();
System.out.println(person.getName());//null //这就很难受,按道理来说,不是应该是张三吗?

大家都知道,像Spring这种框架都是通过反射来实现的,我们就模拟一个“编译类”,我们是在属性上用的注解,所以就先用反射来拿到类的所有属性

public static void main(String[] args) throws NoSuchFieldException {
Person person = new Person(); //按理来说,我们是拿到这个Person.class的所有的属性,然后遍历,来挨个注入,但是这里我们明明确我们的属性名,所以就简单化了
Field field = Person.class.getDeclaredField("name"); MyValue annotation = field.getAnnotation(MyValue.class);//拿到注解类 String name = annotation.value();//这个value()就是我们在MyValue类中的的属性 //然后我们就注入到这个类中,这时就用到了setter方法
person.setName(name); System.out.println("通过自定义注解后的person的name是:" + person.getName());
}

是的,这样我们就通过了自定义注解给Person注入了一个name属性,但是在实际运用中不可能这么复杂,这只是入门了一下,我们可以将这个“模拟的编译类”组装成一个工具类,以便我们在实际中运用。

最新文章

  1. MAC实用的小工具
  2. HTML5入门(---------------HTML——基本骨架--------------)
  3. Web自动化测试学习方向(Selenium)
  4. 【hadoop】——MapReduce解压缩实现
  5. iOS开发-Xcode升级后插件失效解决办法
  6. 在FreeBSD上安装Bugzilla
  7. ASP.NET MVC- 使用PageList.Mvc分页
  8. 判断div是否隐藏
  9. CSS样式表初始化代码
  10. CyQ.data MDataTable
  11. static 变量(静态变量)
  12. Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期
  13. Python3 open函数
  14. php 批量下载文件
  15. 线程 线程池 Task
  16. spring El
  17. Jsp 国际化访问首页选择展示不同字体小例子
  18. css制作tips提示框,气泡框,制作三角形
  19. ActiveMQ队列消息过期时间设置和自动清除解决方案
  20. 开源WebGIS实施方案(四):GeoServer发布PostGIS数据

热门文章

  1. 怎样用QT在windows环境通过编程卸载installShield打包的程序
  2. vue.js纯前端处理如何将后台返回来的csv数据导出成csv文件
  3. Navicat for mysql建立连接
  4. [python]标准比较运算符
  5. 2019DX#8
  6. Codeforces Round #480 (Div. 2) C - Posterized
  7. CodeForces 821D Okabe and City
  8. 牛客小白月赛6 I 公交线路 最短路 模板题
  9. hdu6312 2018杭电多校第二场 1004 D Game 博弈
  10. Netty源码分析 (四)----- ChannelPipeline