项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前台页面需要调整字段顺序或者增加一个字段、删除一个字段时,后台需要修改java代码。经过一上午的重构努力,改为数据库配置字段与字段对应方法,java利用反射动态调用对象方法从而获取字段值,拼接为list传递给前台。这样修改后,代码干净整洁,非常灵活,只要是对象中存在的方法,可以在数据库中任意配置显示与否、显示顺序等,现在分别介绍下实现过程:

一、数据库定义


CREATE TABLE `IS_WEB_TABLECONF`  (
  `guid` bigint(20) NOT NULL,
  `columnname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--字段在页面的显示名称
  `language` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL--语言,可以配置多套语言环境的数据
  `columnmethodname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,,--字段的反射方法
  `orderstr` int(10) DEFAULT NULL,--字段在页面的显示顺序

`tablename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--表单名称
  `modulename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--模块名称
  PRIMARY KEY (`guid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of IS_WEB_TABLECONF
-- ----------------------------
INSERT INTO `IS_WEB_TABLECONF` VALUES (1, '公司名称:', 'zh-ch', 'getBranchName', 1, b'0', 23, '2019-09-18 10:44:32', '2019-09-18 10:44:30', 12, 'WebInstallation', 'BaseInfo');
INSERT INTO `IS_WEB_TABLECONF` VALUES (2, '初始分公司:', 'zh-ch', 'getProtocolStartDate', 2, b'0', 345, '2019-09-18 10:45:48', '2019-09-18 10:45:50', 4, 'WebInstallation', 'BaseInfo');
 
二、java中根据不同模块查询对应的表格定义,组装数据
 
private void getListInfo(String licenseClassName, List qualifyList, Object dto, String qualifyInfo) {
//licenseClassName需要反射对象的类路径名称,如:
"com.neuxa.is.isinterface.fm.dto.IsSlInstallationunitReviewDto"
//dto是查询好带有数据信息的对象实体

    List<IsWebTableconfDto> tableConfQua = dictionaryUtil.getTableConf("WebInstallation", qualifyInfo);
for (IsWebTableconfDto confDto : tableConfQua) {
JSONObject object = new JSONObject();
object.put("key", confDto.getColumnname());
String value = "";
value = getInvokeMethodValue(licenseClassName, confDto.getColumnmethodname(), dto);
object.put("value", value);
qualifyList.add(object);
}
private String getInvokeMethodValue(String classBeanName,String methodName,Object curDto){
String value="";
try {
Class<?> clazz = Class.forName(classBeanName);
Method method = clazz.getDeclaredMethod(methodName);
method.setAccessible(true);
Object invoke = method.invoke(curDto);
value=invoke.toString();
}catch(Exception e){
e.printStackTrace();
}
return value;
}

利用java反射动态调用方法,生成grid数据的更多相关文章

  1. C# 知识点笔记:IEnumerable<>的使用,利用反射动态调用方法

    IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...

  2. 利用java反射机制对方法进行调用

    http://blog.csdn.net/coolcoffee168/article/details/5835143

  3. golang通过反射动态调用方法

    func Call(m map[string]interface{}, name string, params ...interface{}) ([]reflect.Value, error) { f ...

  4. Guava动态调用方法

    前言 大家在Coding的时候,经常会遇到这样一个情况,根据不同的条件去执行对应的代码.我们通常的处理方式是利用if-else判断,或者直接switch-case,特别是jdk1.6之后,swith开 ...

  5. 利用java反射调用类的的私有方法--转

    原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...

  6. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  7. C# 利用反射动态调用类成员

    用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): publicobject InvokeMember(    string name, ...

  8. 使用反射动态调用ActiveX控件

    使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...

  9. 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

    有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 packag ...

随机推荐

  1. nginx的RPM包制作案例

    使用nginx-1.12.2版本的源码软件,生成对应的RPM包软件,具体如下: - 软件名称为nginx - 软件版本为1.12.2 - RPM软件包可以查询描述信息 - RPM软件包可以安装及卸载 ...

  2. openprocess提升为测试权限

    BOOL EnableDebugPrivilege() { HANDLE hToken; BOOL fOk=FALSE; if(OpenProcessToken(GetCurrentProcess() ...

  3. Promise.race 的原理

    // race的原理 Promise.race = function(values){ return new Promise((resolve,reject)=>{ for(let i = 0 ...

  4. LOJ6300 BZOJ5283 [CodePlus 2018 3 月赛]博弈论与概率统计

    一道好题!很久以前就想做了,咕到了现在,讲第二遍了才做. 首先我们观察到$p$是没有用的 因为赢的次数一定 那么每一种合法序列出现的概率均为$p^n*(1-p)^m$ 是均等的 我们可以不看它了 然后 ...

  5. 16.go语言基础学习(上)——2019年12月16日

    2019年12月13日10:35:20 1.介绍 2019年10月31日15:09:03 2.基本语法 2.1 定义变量 2019年10月31日16:12:34 1.函数外必须使用var定义变量 va ...

  6. mitmproxy 使用mitmdump 过滤请求

    mitmproxy 抓包工具,优点可以使用python进行二次开发,或者进行接口的mock 官网地址:https://www.mitmproxy.org/ 打算用这个最初的需求是,想对app做接口测试 ...

  7. Python3解leetcode First Bad Version

    问题描述: You are a product manager and currently leading a team to develop a new product. Unfortunately ...

  8. phpexcel如何读和写大于26列的excel

    主要运用到PHPExcel_Cell类的两个方法 1读取excel大于26列时. PHPExcel_Cell::columnIndexFromString($highestColumm)://由列名转 ...

  9. 【数据库】一篇文章搞掂:Oracle数据库

    PL/SQL的使用 1.安装使用 1.1.安装暂略 1.2.使用 添加环境变量 打开PL/SQL,不要登录,进入界面后,打开设置Preference 设置主目录和OCI库

  10. vue-lazyload 图片不更新

    前几天在用vue写项目的时候,因为图片比较多,所以采用了懒加载插件 vue-lazyload github:https://github.com/hilongjw/vue-lazyload#readm ...