Java中自定义注解类,并加以运用
2024-10-19 14:54:54
在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属性,但是在实际运用中不可能这么复杂,这只是入门了一下,我们可以将这个“模拟的编译类”组装成一个工具类,以便我们在实际中运用。
最新文章
- MAC实用的小工具
- HTML5入门(---------------HTML——基本骨架--------------)
- Web自动化测试学习方向(Selenium)
- 【hadoop】——MapReduce解压缩实现
- iOS开发-Xcode升级后插件失效解决办法
- 在FreeBSD上安装Bugzilla
- ASP.NET MVC- 使用PageList.Mvc分页
- 判断div是否隐藏
- CSS样式表初始化代码
- CyQ.data MDataTable
- static 变量(静态变量)
- Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期
- Python3 open函数
- php 批量下载文件
- 线程 线程池 Task
- spring El
- Jsp 国际化访问首页选择展示不同字体小例子
- css制作tips提示框,气泡框,制作三角形
- ActiveMQ队列消息过期时间设置和自动清除解决方案
- 开源WebGIS实施方案(四):GeoServer发布PostGIS数据
热门文章
- 怎样用QT在windows环境通过编程卸载installShield打包的程序
- vue.js纯前端处理如何将后台返回来的csv数据导出成csv文件
- Navicat for mysql建立连接
- [python]标准比较运算符
- 2019DX#8
- Codeforces Round #480 (Div. 2) C - Posterized
- CodeForces 821D Okabe and City
- 牛客小白月赛6 I 公交线路 最短路 模板题
- hdu6312 2018杭电多校第二场 1004 D Game 博弈
- Netty源码分析 (四)----- ChannelPipeline