2021-09-07

Java使用反射set对象的属性值

应用场景

实际项目中有可能需要,从数据库表中获取实体字段名称,然后设置字段值,展示在vue页面上的案例。

首先我们看看效果。

2021-09-07
1、首先上面的这个表格的表头是从数据库取出来。然后循环写到页面上的;
2、表头对应的值也是从数据库中取出来的。
3、至于要打“√”,还是打“×”,都是放在数据库中,存的是字段值。这个字段值也不是固定的
4、所以我最后采用了反射的思路来实现这个问题。

前端使用Vue实现,Ant design

<template>
 <a-modal :visible="tabVisible" width="1200" @cancel='handleCancel' @ok="handleOk">
   <a-table
            :data-source="datas" :bordered="bordered"
            :loading="loading" :size="tableSize" :pagination="pagination"
            :rowKey="(record,index)=>{return index}" :scroll="{ x: 2500, y: 400 }"
            @change="handleTableChange">
        <!-- 定制表格表头 -->
        <a-table-column v-for="(item, index) in colList" :key="index" :title="item.zdxmc"
           :data-index="item.zdxbsf" align="center" width="380"/>
    </a-table>
 </a-modal>
</template>
<script>
export default {
   name: "DynamicTable",
   props: {
       ywlx: String,
       flag: String,
       visible: Boolean,
       orgCode: String
   },
    data() {
      return {
        colList: [],
        datas: [],
        tabVisible: false,
        loading: false,
        tableSize:'small',
        bordered: true,
        //分页
        pagination:{
            current: 0,
            pageSize: 10,
            pageSizeOptions: ['10', '20', '30'],
            showTotal: (total, range) => {
                return range[0] + "-" + range[1] + " 共" + total + "条"
            },
            showQuickJumper: true,
            showSizeChanger: true,
            total: 0
        },
    }
 },
 created() {
     this.queryColumn();
 },
 watch: {
      visible: {
          handler(v) {
              this.tabVisible = v;
              if (v && this.orgCode) {
                  this.queryList();
              }
          }
      }
  },
 methods: {
 	//请求表格头部数据,从数据库中取出,
 	//如果数据库中存放的值,有xx_yyy,需要后端处理一下,改变为驼峰命名,方便后续处理
     queryColumn() {
     let param={您的参数}
        this.$api.apiBtxtpxList(param).then((res) => {
             console.log(res)
             if (res.success) {
                 this.colList = res.result
             } else {
                 this.$message.error(res.message)
             }
         }).catch(e => {
             console.log(e)
         })
      },

      handleCancel() {
           this.tabVisible = false
           this.$emit('handleCancel', false)
       },

       handleOk() {
           this.tabVisible = false;
           this.$emit("handleOk", false)
       },
		
		//查询表格中的数据
       queryList() {
           this.loading = true;
           let param={
               pageNo:this.pagination.current,pageSize:this.pagination.pageSize
           }
           this.$api.apiBtxtpxSyrkList(param).then((res) => {
               console.log(res)
               this.loading = false;
               if (res.success) {
                   this.datas = res.result.records;
                   this.pagination.total = res.result.total
               } else {
                   this.$message.error(res.message)
               }
           }).catch(e => {
               console.log(e)
               this.loading = false;
           })
       },

        handleTableChange(pagination){
            this.pagination.current = pagination.current;
            this.pagination.pageSize = pagination.pageSize;
            this.queryList();
        }
    }
}
</script>

<style scoped>

</style>

后台实现代码,maven,Springboot

因为涉密关系。我这边做了一个模拟的案例代码,用到了HuTool的hutool-core包。
HuTool官方文档

package com.ross.demo.test;

import lombok.Data;

/**
 * <p>
 * 学生类
 * </p>
 *
 * @author ross zhang
 * @version 1.0
 * @since 2021/9/7 10:34
 */
@Data
public class Student {
    private String id;
    private String name;
    private String age;
    private String stu;
}

定义一个实体类,Student类,

然后是一个测试类

package com.ross.demo.test;

import cn.hutool.core.util.RandomUtil;

import java.lang.reflect.Method;
import java.util.*;

/**
 * <p>
 * 测试反射
 * </p>
 *
 * @author ross zhang
 * @version 1.0
 * @since 2021/9/7 10:36
 */
public class TestStu {
    public static List<Student> add(){
        List<Student> list = new ArrayList<>();
        for (int i=1;i<4;i++){
            Student stu = new Student();
            stu.setAge("10"+i);
            stu.setId(UUID.randomUUID().toString());
            stu.setName(RandomUtil.randomString(3));
            stu.setStu(RandomUtil.randomNumbers(3));
            list.add(stu);
        }

        return list;
    }
    public static void main(String[] args) throws Exception{
        List<Student> stu = add();  //处理前的结果
        for (Student res:stu){
            System.out.println(res.toString());
        }
        System.out.println("=================================================");

        get(stu);  //通过反射设置,需要改变的值,
        for (Student s:stu){
            System.out.println(s.toString());
        }
    }

    /**
     * 定义两个需要修改的字段名,
     * 实际项目中,可以从数据库中取出来。
     * @return
     */
    public static List<String> set(){
        List<String> list = new ArrayList<>();
        list.add("age");
        list.add("stu");
        return list;
    }

    public static void get(List<Student> list) throws Exception {
        Class stuClass = Student.class;
        for (Student stu:list){
            setParam(stu);
        }
    }

    /**
     * 处理反射设置Student中的值,
     * @param stu
     * @throws Exception
     */
    public static void setParam(Student stu) throws Exception {
        Class stuClass = stu.getClass();
        List<String > strList = set();
        for (String str:strList){
            String methname = str.substring(0, 1).toUpperCase() + str.substring(1);  //首字母大写
            Method setParam = stuClass.getMethod("set" +  methname , new Class[]{String.class});
            setParam.invoke(stu, "YYYY");
        }
    }
}

看看结果
2021-09-07
谢谢大家的观看,预祝大家更近一步。少写BUG,加油

上一篇:Go语言基础之结构体练习


下一篇:MySQL 触发器