网站首页 > java教程 正文
前言:
一、注解的介绍
1.自定义注解的定义:Java文件叫做Annotation,用@interface表示。
2.元注解:@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。
3.注解的保留策略:
@Retention(RetentionPolicy.SOURCE) // 注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
4.注解作用于目标:
@Target(ElementType.TYPE) // 接口、类、枚举、注解
@Target(ElementType.FIELD) // 字段、枚举的常量
@Target(ElementType.METHOD) // 方法
@Target(ElementType.PARAMETER) // 方法参数
@Target(ElementType.CONSTRUCTOR) // 构造函数
@Target(ElementType.LOCAL_VARIABLE) // 局部变量
@Target(ElementType.ANNOTATION_TYPE) // 注解
@Target(ElementType.PACKAGE) // 包
5.注解包含在javadoc中:
@Documented
6.注解可以被继承:
@Inherited
7.注解解析器:用来解析自定义注解。
正文:
一、注解的使用
第一步:新建注解MyFirstAnn.class
import java.lang.annotation.*; /** * @package: com.beijingdesigner.hydra.test.sc * @description: Init * @author: IT讲坛 * @create: 2018-11-20 14:22 **/ @Documented @Inherited @Target({ ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyFirstAnn { String value() default ""; }
第二步新建实体类UserDemo.class
package com.beijingdesigner.hydra.test.sc; import lombok.Data; /** * @package: com.beijingdesigner.hydra.test.sc * @description: user * @author: IT讲坛 * @create: 2018-11-20 14:24 **/ @Data public class UserDemo { @MyFirstAnn(value = "Rose") private String name; @MyFirstAnn(value = "女") private String sex; }
第三步新建工厂类UserTestFactory.class
package com.beijingdesigner.hydra.test.sc; import com.alibaba.fastjson.JSON; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * @package: com.beijingdesigner.hydra.test.sc * @description: 工厂类 * @author: BeijingdesignerCapital--shanchangqing * @create: 2018-11-20 14:26 **/ public class UserTestFactory { public static UserDemo create() { UserDemo user = new UserDemo(); // 获取User类中所有的方法(getDeclaredMethods也行) Method[] methods = UserDemo.class.getMethods(); Field[] declaredFields = UserDemo.class.getDeclaredFields(); try { System.out.println("利用field反射赋值"); for (Field f:declaredFields) { if (f.isAnnotationPresent(MyFirstAnn.class)){ MyFirstAnn annotation = f.getAnnotation(MyFirstAnn.class); Method method= user.getClass().getMethod("set"+f.getName().substring(0,1).toUpperCase().concat(f.getName().substring(1)),String.class); method.invoke(user,annotation.value()); } } // System.out.println("利用method反射赋值"); // for (Method method : methods) // { // // 如果此方法有注解,就把注解里面的数据赋值到user对象 // if (method.isAnnotationPresent(MyFirstAnn.class)) // { // MyFirstAnn init = method.getAnnotation(MyFirstAnn.class); // method.invoke(user, init.value()); // } // } } catch (Exception e) { e.printStackTrace(); return null; } return user; } }
第四步新建测试类TestUser.class
package com.beijingdesigner.hydra.test.sc; import com.alibaba.fastjson.JSON; /** * @package: com.beijingdesigner.hydra.test.sc * @description: 测试注解 * @author: IT讲坛 * @create: 2018-11-20 14:27 **/ public class TestUser { public static void main(String []args){ UserDemo user = UserTestFactory.create(); System.out.println(JSON.toJSONString(user)); } }
如果想用method方法反射赋值
需要简单修改下实体类为
package com.beijingdesigner.hydra.test.sc; import lombok.Data; /** * @package: com.beijingdesigner.hydra.test.sc * @description: user * @author: IT讲坛 * @create: 2018-11-20 14:24 **/ @Data public class UserDemo { private String name; private String sex; public String getName() { return name; } @MyFirstAnn(value = "Rose") public void setName(String name) { this.name = name; } public String getSex() { return sex; } @MyFirstAnn(value = "女") public void setSex(String sex) { this.sex = sex; } }
这样放开工厂类上面的注释,测试即可;
自定义注解的应用远不止于此:
比如你在mvc项目中加了过滤器,但是有些方法(你可以通过加自定义注解)需要跳过过滤器。
当然了,你可以在过滤器配置中指定某些包下的方法跳过过滤,这种方式有点陈旧了,不在本次考虑范围内。
1.新建方法注解
package com.beijingdesigner.hydra.test.sc; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @desciption :注解用于跳过过滤器校验 * @author: IT讲坛 * @date:2018-11-20 * @time:15:20 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface NotCheckTAnn { }
2.在controller层添加注解
3.在拦截器里面校验:
4.用postman发起请求测试
5.输出结果:
自定义注解的使用还有很多很多,这里不过多讲解了,有兴趣的同学可以深入研究下,对自己技术的提升肯定是有帮助的。
猜你喜欢
- 2024-09-27 在Spring Boot项目中创建和使用自定义注解
- 2024-09-27 这一篇 Java 注解,写得太好了(java注解使用)
- 2024-09-27 学习廖雪峰的JAVA教程---注解(定义注解@interface)
- 2024-09-27 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?
- 2024-09-27 Spring Boot 整合mybatis,使用注解的方式(自动生成注解)
- 2024-09-27 面试官:实际工作中哪里用到了自定义注解?
- 2024-09-27 使用自定义注解和切面AOP实现Java程序增强
- 2024-09-27 Java-注解有什么用?该怎么用?(java 注解的作用)
- 2024-09-27 Java 17中的元注解:自定义注解的行为
- 2024-09-27 自定义注解你真会用吗?(说说自定义注解的场景及实现)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)