java利用反射机制完成JavaBean的属性赋值

今天碰到一个场景,就是一个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

时间: 2024-11-05 21:37:25

java利用反射机制完成JavaBean的属性赋值的相关文章

java利用反射机制判断对象的属性是否为空

java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String>(); validateMap.put("serial", "编号");validateMap.put("major", "专业"); public static <T> String validateFiledIs

Android利用反射机制为实体类属性赋值

在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面是在我在android中如何利用java反射机制给实体类赋值. 在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包 import java.lang.reflect.Field; import java.lang.reflect.Method; 给实体类赋值首先需要一个实体类,这

利用反射机制 实现 javabean 转化为 map

package com.test.entity; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Collection; import java.util.Date; import java.util.HashMap;

java 中利用反射机制获取和设置实体类的属性值

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可

利用反射机制,对对象的属性值进行自动设置

import java.lang.reflect.Method; /** * 对象的属性值自动设置,利用反射机制 */ public class AutoSet { /** * 将源对象的属性值赋值到目标对象,属性名一致,且源对象有get方法,目标对象有set方法 * @param src 源对象 * @param target 目标对象 * @return 赋值后的目标对象 */ public static Object autoGetterAndSetter(Object src, Obje

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

Java通过反射机制修改类中的私有属性的值

首先创建一个类包含一个私有属性: class PrivateField{ private String username = "Jason"; } 通过反射机制修改username的值: //创建一个类的对象 PrivateField privateField = new PrivateField(); //获取对象的Class Class<?> classType = privateField.getClass(); //获取指定名字的私有域 Field field =

利用反射机制,获取类的字段、方法、并实现简单调用

这篇文章是为之后要介绍Android的ICO框架做预备的,所以,如果想最近学习Android的ICO框架的同学,可以稍微看一下. 首先,简单介绍一下Java里面的反射. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 不知道这样的一段解释,你能否看懂.如果更简单的说,反射就是能够根据你给出类名实例化出一个实实在在的对象.所以,对象的实例