今天碰到一个场景,就是一个JavaBean,有些属性的值需要去数据库其他表中获取,这样就需要调用其他dao方法得到这个值,然后再set进去。
可是问题来了,如果需要用这种方式赋值的属性特别多的话,一个一个set进去就需要写很多set方法,代码不仅冗余,而且很麻烦。
于是就想通过反射机制去自动set值。
假设有JavaBean为CreditRatingFile.java类,某些属性值需要调用CreditRatingFileApplyService类中的方法获得,并拿到返回值再set出这些属性。
一、拿到所有JavaBean为CreditRatingFile.java类的属性
二、拿到多有CreditRatingFileApplyService类的方法
三、匹配之后再根据CreditRatingFile.java的setter方法set对应CreditRatingFileApplyService类方法的返回值
贴出代码:
反射工具类:
package com.krm.modules.creditFileApplay.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.krm.modules.creditFileApplay.model.CreditRatingFile;
import com.krm.modules.creditFileApplay.service.CreditRatingFileApplyService;
import com.thinkgem.jeesite.common.utils.Reflections;
public class ReflectUtil {
@SuppressWarnings("unused")
public static <E> E genValueByGenerics(Class<?> clazz,Class<?> seviceClz,E entity) {
Map<String, Field> resutlMap = new LinkedHashMap<String, Field>();
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
resutlMap.put(field.getName(), field);
// System.out.println(field.getName());
//获取到javaBean中所有属性后,通过反射机制与service所有方法匹配
String toServiceMethodName = "get"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1, field.getName().length());
if ("getCreditLimit2".equals(toServiceMethodName) || "getCreditRatingLevel3".equals(toServiceMethodName)) {
doServiceMethod(seviceClz,toServiceMethodName,entity,field.getName());
}
}
}
return entity;
}
public static void bianLi(Object obj){
Field[] fields = obj.getClass().getDeclaredFields();
for(int i = 0 , len = fields.length; i < len; i++) {
// 对于每个属性,获取属性名
String varName = fields[i].getName();
try {
// 获取原来的访问控制权限
boolean accessFlag = fields[i].isAccessible();
// 修改访问控制权限
fields[i].setAccessible(true);
// 获取在对象f中属性fields[i]对应的对象中的变量
Object o;
try {
o = fields[i].get(obj);
System.err.println("传入的对象中包含一个如下的变量:" + varName + " = " + o);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 恢复访问控制权限
fields[i].setAccessible(accessFlag);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
}
}
/**
* 获得所有方法
* @param clz
* @return
*/
public static List<String> genSetMethodCode(Class<?> clz) {
List<String> setMethods = new ArrayList<>();
Method[] declaredMethods = clz.getDeclaredMethods();
String name = clz.getName();
int dot = name.lastIndexOf(".");
String objName = name.substring(dot+1, dot+2).toLowerCase() + name.substring(dot+2);
for (Method declaredMethod : declaredMethods) {
String methodName = declaredMethod.getName();
setMethods.add(objName + "." + methodName + "();");
}
for (String string : setMethods) {
System.out.println(string);
}
return setMethods;
}
/**
* 获取指定service类的所有方法,并调用
* @param clz
*/
public static <E> void doServiceMethod(Class<?> clz,String beanAttribute,E entity,String propertyName){
Method[] declaredMethods = clz.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
String methodName = declaredMethod.getName();
if (beanAttribute.equals(methodName)) {
reflectMethod(methodName,clz,entity,propertyName);
}
}
}
public static <E> void reflectMethod(String methodName,Class<?> clz,E entity,String propertyName){
try {
//可以传固定的某个类的具体路径,也可以传class的getName()参数。
// Class<?> cls = Class.forName("com.krm.modules.creditFileApplay.service.CreditRatingFileApplyService");/
Class<?> cls = Class.forName(clz.getName());
Object obj = cls.newInstance();
//第一个参数是被调用方法的名称,后面接着这个方法的形参类型
Class[] argTypes=new Class[1];
argTypes[0]=Map.class;
Method setFunc = cls.getMethod(methodName,argTypes);
//取得方法后即可通过invoke方法调用,传入被调用方法所在类的对象和实参,对象可以通过cls.newInstance取得
Map<String,Object> map = new HashMap<String,Object>();
//获取指定方法运行结果
Object result = setFunc.invoke(obj,map);
//调用setter方法
Reflections.invokeSetter(entity, propertyName, result);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
CreditRatingFile entity = new CreditRatingFile();
entity.setCreditLimit3("444");
genValueByGenerics(CreditRatingFile.class, CreditRatingFileApplyService.class,entity);
System.out.println("实体类通过反射机制获取到的属性值为:"+entity.getCreditLimit2());
System.out.println("实体类通过反射机制获取到的属性值为:"+entity.getCreditRatingLevel3());
System.out.println("实体类通过反射机制获取到的属性值为:"+entity.getCreditLimit3());
}
}
service类中的方法
public class CreditRatingFileApplyService extends MybatisBaseService<CreditRatingFileApply> {
@Resource
private CreditRatingFileApplyDao creditRatingFileApplyDao;
@Override
public String getTableName() {
return ConfigUtils.getValue("schema.configPlat") + ".CREDIT_RATING_FILE_APPLY";
}
@Override
public String getIdKey() {
return "id";
}
@Override
public MybatisBaseDao<CreditRatingFileApply> getDao() {
return creditRatingFileApplyDao;
}
public List<CreditRatingFileApply> queryByParam(Map<String, Object> params){
return creditRatingFileApplyDao.queryByParam(params);
}
public String getHomeValue(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getHomeValue(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getCarName(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getCarName(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getCarNum(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getCarNum(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getCarValue(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getCarValue(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getAssetSum(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getAssetSum(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getBusinessAsset1(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getBusinessAsset1(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear1FamilyIncome(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear1FamilyIncome(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear1DebtSum(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear1DebtSum(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear2FamilyIncome(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear2FamilyIncome(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear2DebtSum(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear2DebtSum(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear3FamilyIncome(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear3FamilyIncome(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
}
原文地址:https://www.cnblogs.com/deyujincheng/p/9332780.html