通过反射将注解的值赋给对象的属性

一.前言

这一篇文章我们主要讲如何通过反射将注解的值赋给对象的属性,在这之前我们先简单了解一下什么是反射和注解。

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方法,通过下图可以看到控制打印出的记录是我们所期待的,测试通过。

java 反射 设置对象类型 java反射给对象属性赋值_java