利用Java 反射技术获取POJO的属性

我们开发Java web应用的时候,经常会用到Spring boot 或者其他框架, 我们对各种POJO转换数据,非常熟悉, 用都会用, 但是他们是怎么实现的呢?

为什么定义一个POJO, 什么mongodb,或者spring data,就能把数据从数据库取出来, 然后转换成我们需要的POJO 实体Object, 他们是用了什么技术?

这里,我给大家讲一点点, 冰山一角.

如果要把数据填充到POJO,让他变成一个有数据的实体,我们首先要掌握POJO class 定义是怎么样的.

我们先来定一个简单的POJO类

 

Student.java

package com.example.demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    @PrimaryKeyType
    public Long uid;
    public String name;
    public Long age;
    public String schoolName;

}
我们用了Lombok, 帮我们生成Getter, Setter, 这里就不过多解释了.

注意看,这里有个@PrimaryKeyType 的注解, 它是我们自己定义的, 我们把Uid加了这个注解,作用是指定它为主键

 

看一下PrimaryKeyType的定义

package com.example.demo;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface PrimaryKeyType {
}
需要注意,要加上Retention注解,并指定RetentionPolicy为RUNTIME,这样java反射技术,就可以获取POJO携带的注解信息, 这个必须要加上才能工作.

 

接下来我们写测试代码解析一下POJO类,获取一些我们需要了解的信息, 比如POJO类有哪些属性,名字是什么, 是什么数据类型, 然后找一下主键

 

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Field;

@Slf4j
class DemoTests {

    @Test
    public void t01Test() throws IllegalAccessException, InstantiationException {
        String _cm = "[email protected]";

        for (Field x : Student.class.getDeclaredFields()) {
            log.info(_cm + " 属性名: {}, 数据类型:{}", x.getName(), x.getType().getName());
            if (x.isAnnotationPresent(PrimaryKeyType.class)) {
                log.info(_cm + " 主键类型找到, 属性名:{}", x.getName());
            }
        }

    }

}
运行,然后看看找到了属性和主键了没有

19:34:11.981 [main] INFO com.example.demo.DemoTests - [email protected] 属性名: uid, 数据类型:java.lang.Long
19:34:11.985 [main] INFO com.example.demo.DemoTests - [email protected] 主键类型找到, 属性名:uid
19:34:11.985 [main] INFO com.example.demo.DemoTests - [email protected] 属性名: name, 数据类型:java.lang.String
19:34:11.985 [main] INFO com.example.demo.DemoTests - [email protected] 属性名: age, 数据类型:java.lang.Long
19:34:11.985 [main] INFO com.example.demo.DemoTests - [email protected] 属性名: schoolName, 数据类型:java.lang.String

分类: java 标签: java 发布于: 2021-02-04 10:31:14, 点击数: