网站首页 > 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反编译工具 (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)
本文暂时没有评论,来添加一个吧(●'◡'●)