java反射-BeanUtil

package com.ming.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.websocket.Session;

/**
 * Bean处理工具类
 * @author Ming
 */

public class BeanUtils {
	/**
	 * 获取一个Bean实例
	 * @param className
	 * @return
	 */
	public static Object getBean(String className) {
		try {
			Class<?> c = Class.forName(className);
			Object o = c.newInstance();
			return o;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 执行某对象方法
	 * 
	 * @param owner
	 *            对象
	 * @param methodName
	 *            方法名
	 * @param args
	 *            参数
	 * @return 方法返回值
	 * @throws Exception
	 */
	public static Object invokeMethod(Object owner, String methodName, Session session, String message)
			throws Exception {
		Class<? extends Object> ownerClass = owner.getClass();
		Class<? extends Object>[] argsClass = new Class<?>[2];
		argsClass[0] = Session.class;
		argsClass[1] = String.class;
		Method method = ownerClass.getMethod(methodName, argsClass);
		return method.invoke(owner,new Object[]{session,message});
	}
	/**
	 * 执行某对象方法
	 * 
	 * @param owner
	 *            对象
	 * @param methodName
	 *            方法名
	 * @param args
	 *            参数
	 * @return 方法返回值
	 * @throws Exception
	 */
	public static Object invokeMethod(Object owner, String methodName, Object[] objects)
			throws Exception {
		Class<? extends Object> ownerClass = owner.getClass();
		Class<? extends Object>[] argsClass = new Class<?>[objects.length];
		for (int i = 0; i < objects.length; i++) {
			argsClass[i] = objects[i].getClass();
		}
		Method method = ownerClass.getMethod(methodName, argsClass);
		return method.invoke(owner,objects);
	}
	/**
	 * 执行某类的静态方法
	 * 
	 * @param className
	 *            类名
	 * @param methodName
	 *            方法名
	 * @param args
	 *            参数数组
	 * @return 执行方法返回的结果
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	public static Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception {
		Class<?> ownerClass = Class.forName(className);

		Class[] argsClass = new Class[args.length];

		for (int i = 0, j = args.length; i < j; i++) {
			argsClass[i] = args[i].getClass();
		}

		Method method = ownerClass.getMethod(methodName, argsClass);

		return method.invoke(null, args);
	}
	
	/**
	 * 反射,根据当前传入对象实例,属性名,返回执行后的值
	 * 
	 * @param obj
	 * @param fieldName
	 * @return
	 * @throws Exception
	 */
	public static Object getProperty(Object obj, String fieldName) {
		if (obj == null || fieldName == null) {
			return null;
		}
		String m = fieldName.substring(0, 1).toUpperCase();
		String []splits = fieldName.split(",");
		String objectName,propertyName;
		if(splits.length>1){
			String objname = splits[0];   //二级对象名字
			String propname = splits[1];  //二级对象的属性名字
			objectName = "get"+objname;
			propertyName = "get"+propname;
			try {
				try {
					Object oo = obj.getClass().getMethod(objectName, new Class[0]).invoke(obj); //获取二级对象
					if (oo == null){
						return null;
					}
					return oo.getClass().getMethod(propertyName, new Class[0]).invoke(oo);
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			} catch (SecurityException e2) {
				e2.printStackTrace();
			} catch (NoSuchMethodException e2) {
				e2.printStackTrace();
			}
		}else{
			if(Character.isUpperCase(fieldName.charAt(1))==true){
				m=m.toLowerCase();
			}
			m = "get" + m + fieldName.substring(1, fieldName.length());
			try {
				return obj.getClass().getMethod(m, new Class[0]).invoke(obj);
			} catch (Exception e) {
				m = fieldName.substring(0, 1).toUpperCase();
				m = "is" + m + fieldName.substring(1, fieldName.length());
				try {
					return obj.getClass().getMethod(m, new Class[0]).invoke(obj);
				} catch (Exception e1) {
				} 
			}
		}
		return null;
	}

	/**
	 * 反射,根据当前传入对象实例,属性名,设置值
	 * 
	 * @param obj
	 * @param fieldName
	 * @param val
	 */
	public static void setProperty(Object obj, String fieldName, Object val) {
		if (obj == null || fieldName == null) {
			return;
		}
		String m = fieldName.substring(0, 1).toUpperCase();
		m = "set" + m + fieldName.substring(1, fieldName.length());
		try {
			Method[] methods = getAllMethods(obj.getClass());
			for (Method method : methods) {
				if (m.equals(method.getName())) {
					method.invoke(obj, val);
					break;
				}
			}
		} catch (Exception e) {
		}
	}
	
	/**
	 * 递归查找所有的属性,包括父类的属性
	 * 
	 * @param object
	 * @return
	 */
	public static Field[] getAllDeclaredFields(Class<?> cla) {

		if (cla != null && cla != Object.class) {
			Field[] fields = cla.getDeclaredFields();

			Field[] resFields = fields;

			Field[] fields_ = getAllDeclaredFields(cla.getSuperclass());

			if (fields_ != null) {
				resFields = new Field[fields.length + fields_.length];
				System.arraycopy(fields, 0, resFields, 0, fields.length);
				System.arraycopy(fields_, 0, resFields, fields.length, fields_.length);
			}

			return resFields;
		}

		return null;
	}
	
	/**
	 * 查找属性,包括父类的属性
	 * 
	 * @param object
	 * @return
	 */
	public static Field getDeclaredFieldByName(Class<?> cla, String fieldName) {
		for(Field f : getAllDeclaredFields(cla)){
			if(f.getName().equals(fieldName))
				return f;
		}
		return null;
	}
	
	/**
	 * 根据方法名获取方法
	 * @param cla
	 * @param name
	 * @return
	 */
	public static Method getMethod(Class<?> cla, String name){
		for(Method m : getAllMethods(cla)){
			if(m.getName().equals(name)){
				return m;
			}
		}
		return null;
	}
	
	/**
	 * 递归获取所有的方法
	 * @param cla
	 * @return
	 */
	public static Method[] getAllMethods(Class<?> cla){
		if (cla != null && cla != Object.class) {
			Method[] methods = cla.getDeclaredMethods();

			Method[] resMethods = methods;

			Method[] methods_ = getAllMethods(cla.getSuperclass());

			if (methods_ != null) {
				resMethods = new Method[methods.length + methods_.length];
				System.arraycopy(methods, 0, resMethods, 0, methods.length);
				System.arraycopy(methods_, 0, resMethods, methods.length, methods_.length);
			}

			return resMethods;
		}
		return null;
	}
}

 

### 回答1: BeanUtil.copyToList是一个Java语言中的工具类方法,它可以将源Bean对象的属性值复制到目标List集合中的对象中。这个工具类方法的主要作用是简化开发者在对象属性复制方面的工作量,让开发者更容易编写代码。 使用BeanUtil.copyToList方法时,需要传递三个参数:源Bean对象、目标List集合对象、目标List集合对象中的元素类型。在执行过程中,BeanUtil.copyToList方法会通过Java反射机制获取源对象的所有属性值,并将这些属性值复制到目标List集合中的对象中。 使用BeanUtil.copyToList方法时需要注意的是,源对象和目标集合中的元素类型要匹配。如果类型不匹配,BeanUtil.copyToList方法会抛出ClassCastException异常。 BeanUtil.copyToList方法可以用于很多场景,例如将数据库查询结果转换为List集合对象、将JSON字符串转换为Java对象等等。总之,BeanUtil.copyToList方法是一个非常实用的工具类方法,可以大大提高Java开发效率。 ### 回答2: beanutil.copytolist是一个Java开发语言中的一个工具类库,主要是用于对象之间的数据复制,特别是在集合(List)对象之间的数据复制方面。BeanUtil.copyToList方法是在不同类型的对象之间复制属性值,并将它们添加到目标列表中的一个快速、简单和方便的方法。 在应用程序开发过程中,数据复制是一个非常常见的任务,例如将一个java对象的属性值拷贝到另一个java对象中,在这种情况下,我们往往需要编写大量的样板代码。但是,在使用BeanUtil.copyToList方法的情况下,这些样板代码可以得到有效的简化,提高了开发效率。 使用BeanUtil.copyToList的方法可以将源集合(List)上的所有Bean属性值复制到目标对象集合上。BeanUtil.copyToList方法内部会根据源JavaBean的属性信息和目标JavaBean的属性信息以及属性之间的对应关系进行属性值的转换,从而完成JavaBean的属性拷贝。这个方法不仅能够自动处理JavaBean之间的拷贝,还能够深度拷贝一个集合中的所有bean信息。 除了实现快速、简单和方便的对象属性拷贝,BeanUtil.copyToList还具有其他有用的特性。例如,当源JavaBean中的属性的值为null时,这些值可以根据需要进行处理。此外,它还可以将枚举类型属性的值转换为目标 JavaBean 实例中的枚举类型,从而避免了使用枚举调整和转换代码的需求。同时,BeanUtil.copyToList还有一个特性,即它能够处理一些通用的数据类型,例如日期,BigDecimal,byte和String等类型。 总之,BeanUtil.copyToList是一个Java开发中非常实用的工具类库,它可以帮助开发者简化对象属性拷贝的工作,提高开发效率和质量。它可以帮助我们将JavaBean对象之间的数据复制和转换变得更加简单、快速、灵活和高效,这使得我们不需要为了数据拷贝而编写大量的样板代码,而能够将更多的精力投入到业务逻辑的处理和应用程序的测试等方面。 ### 回答3: beanutil.copytolist是Java中的一个工具类,它可以将一个对象列表,即源列表中的各个对象逐一复制到目标列表中,并返回目标列表。 该方法可用于多种情况,例如在Java中进行对象复制、实体映射或列表转换时,可以使用beanutil.copytolist方法,从而简化代码实现,提高开发效率。 使用该方法需要指定源列表和目标列表的数据类型,然后将源列表中的对象逐一复制到目标列表中,并返回目标列表。源列表和目标列表中的对象类型可以不同,但必须是互相兼容的。 使用beanutil.copytolist方法有以下几个步骤: 1. 定义源列表和目标列表的类型,例如List<Student>和List<Person>; 2. 使用BeanUtils.copyProperties方法将源列表中的对象复制到目标列表中,例如: for (Student student : studentList) { Person person = new Person(); BeanUtils.copyProperties(student, person); personList.add(person); } 3. 返回目标列表。 使用beanutil.copytolist方法时需要注意以下几个问题: 1. 源列表和目标列表中的对象类型必须兼容,否则会出现异常; 2. 源列表和目标列表中的对象属性名和类型必须一致,否则会出现数据转换错误; 3. 目标列表中的对象必须是新创建的,不能是已存在的对象,否则会出现数据被重复覆盖的问题。 总之,beanutil.copytolist是Java中一个实用的工具类,使用方便简单,可以帮助我们进行对象复制、实体映射或列表转换等操作。在使用时需要注意参数类型和属性名、类型的一致性,避免出现异常和错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值