Java使用反射set对象的属性值
应用场景
实际项目中有可能需要,从数据库表中获取实体字段名称,然后设置字段值,展示在vue页面上的案例。
首先我们看看效果。
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");
}
}
}
看看结果
谢谢大家的观看,预祝大家更近一步。少写BUG,加油