通过反射将注解的值赋给对象的属性
一.前言
这一篇文章我们主要讲如何通过反射将注解的值赋给对象的属性,在这之前我们先简单了解一下什么是反射和注解。
1.什么是反射
Java反射机制是指在程序运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。
2.什么是注解
注解可以理解成一个标签,是给类、方法、变量、属性等加标签。
注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响,所以要由开发者提供相应的代码来提取并处理 Annotation 信息。
二.代码实现
代码主要是实现通过给注解的value赋值后将此值在通过反射赋值给某个对象的属性。
1.编写MyAnnotation注解
首先我们先定义一个名为MyAnnotation的注解
package com.temperature.humidity.system.reflection.annotation;
import java.lang.annotation.*;
/**
* @author yuhe
*/
@Documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
2.编写实体类
package com.temperature.humidity.system.reflection.entity;
import com.temperature.humidity.system.reflection.annotation.MyAnnotation;
import lombok.Data;
/**
* 人
*/
@Data
public class Person {
/**
* 姓名
*/
@MyAnnotation("heyu")
private String name;
/**
* 年龄
*/
@MyAnnotation("23")
private Integer age;
}
3.编写OurBeanUtil类
该类有一个核心方法setMyAnnotationValueToBean,作用是如果该对象的属性上面有MyAnnotation注解,那么将该注解的value赋给该属性。
package com.temperature.humidity.system.reflection.utils;
import cn.hutool.core.convert.Convert;
import com.temperature.humidity.system.reflection.annotation.MyAnnotation;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
/**
* OurBeanUtil工具类
*/
public class OurBeanUtil {
/**
* 如果该对象的属性上面有MyAnnotation注解,
* 那么将该注解的value赋给该属性。
*/
public static <T> void setMyAnnotationValueToBean(T instance) {
try {
//获取传入对象的类模板
Class<?> aClass = instance.getClass();
//获取该类模板的属性数组并遍历
for (Field field : aClass.getDeclaredFields()) {
//获取该属性的MyAnnotation注解
MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
//如果没有MyAnnotation注解则跳过继续遍历
if (annotation == null) {
continue;
}
//获取MyAnnotation注解的value值
String value = annotation.value();
//获取该属性的类型
Type type = field.getType();
//将字符串转换为指定类型
Object bean = Convert.convertQuietly(type, value);
//取消Java语言访问检查(为了操作此对象的私有属性)
field.setAccessible(true);
//将MyAnnotation注解的value值赋给instance对象
field.set(instance, bean);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
4.编写Demo类
该类主要就是有一个main方法用来测试BeanUtil工具类的setMyAnnotationValueToBean方法。
package com.temperature.humidity.system.reflection.demo;
import com.temperature.humidity.system.reflection.entity.Person;
import com.temperature.humidity.system.reflection.utils.BeanUtil;
public class Demo {
public static void main(String[] args) {
Person person = new Person();
System.out.println("使用setMyAnnotationValueToBean方法前 = " + person);
BeanUtil.setMyAnnotationValueToBean(person);
System.out.println("使用setMyAnnotationValueToBean方法后 = " + person);
}
}
三.测试
我们启动main方法,通过下图可以看到控制打印出的记录是我们所期待的,测试通过。