`

Java反射工具类

    博客分类:
  • Java
阅读更多
部门代码来源于传智播客张孝祥老师的代码
视频下载:http://www.itcast.cn/video


import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

/**
 * 问题:JDK5中不能传递二个可变参数,如:methodInvoke()方法
 * 
 */
public class ReflectUtils {

	/**
	 * 通过构造函数实例化对象 
	 * @param className       类的全路径名称	
	 * @param parameterTypes  参数类型
	 * @param initargs        参数值
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static Object constructorNewInstance(String className,Class [] parameterTypes,Object[] initargs) { 
		try {
			Constructor<?> constructor = (Constructor<?>) Class
					.forName(className).getDeclaredConstructor(parameterTypes);					    //暴力反射
			constructor.setAccessible(true);
			return constructor.newInstance(initargs);
		} catch (Exception ex) {
			throw new RuntimeException();
		}

	}

	
	/**
	 * 暴力反射获取字段值
	 * @param fieldName 属性名
	 * @param obj       实例对象
	 * @return          属性值
	 */
	public static Object getFieldValue(String propertyName, Object obj) {
		try {
			Field field = obj.getClass().getDeclaredField(propertyName);			
			field.setAccessible(true);
			return field.get(obj);
		} catch (Exception ex) {
			throw new RuntimeException();
		}
	}
	
	/**
	 * 暴力反射获取字段值
	 * @param propertyName 属性名
	 * @param object       实例对象
	 * @return          字段值
	 */
	public static Object getProperty(String propertyName, Object object) {
		try {
			
			PropertyDescriptor pd = new PropertyDescriptor(propertyName,object.getClass());
			Method method = pd.getReadMethod();
			return method.invoke(object);
			
			//其它方式
			/*BeanInfo beanInfo =  Introspector.getBeanInfo(object.getClass());
			PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
			Object retVal = null;
			for(PropertyDescriptor pd : pds){
				if(pd.getName().equals(propertyName))
				{
					Method methodGetX = pd.getReadMethod();
					retVal = methodGetX.invoke(object);
					break;
				}
			}
			return retVal;*/
		} catch (Exception ex) {
			throw new RuntimeException();
		}
	}
	
	/**
	 * 通过BeanUtils工具包获取反射获取字段值,注意此值是以字符串形式存在的,它支持属性连缀操作:如,.对象.属性
	 * @param propertyName 属性名
	 * @param object       实例对象
	 * @return          字段值
	 */
	public static Object getBeanInfoProperty(String propertyName, Object object) {
		try {			
			return BeanUtils.getProperty(object, propertyName);
		} catch (Exception ex) {
			throw new RuntimeException();
		}
	}
	
	/**
	 * 通过BeanUtils工具包获取反射获取字段值,注意此值是以字符串形式存在的
	 * @param object       实例对象
	 * @param propertyName 属性名
	 * @param value        字段值
	 * @return          
	 */
	public static void setBeanInfoProperty(Object object,String propertyName,String value) {
		try {			
			BeanUtils.setProperty(object, propertyName,value);
		} catch (Exception ex) {
			throw new RuntimeException();
		}
	}
	
	/**
	 * 通过BeanUtils工具包获取反射获取字段值,注意此值是以对象属性的实际类型
	 * @param propertyName 属性名
	 * @param object       实例对象
	 * @return          字段值
	 */
	public static Object getPropertyUtilByName(String propertyName, Object object) {
		try {			
			return PropertyUtils.getProperty(object, propertyName);
		} catch (Exception ex) {
			throw new RuntimeException();
		}
	}
	
	/**
	 * 通过BeanUtils工具包获取反射获取字段值,注意此值是以对象属性的实际类型,这是PropertyUtils与BeanUtils的根本区别
	 * @param object       实例对象
	 * @param propertyName 属性名
	 * @param value        字段值
	 * @return          
	 */
	public static void setPropertyUtilByName(Object object,String propertyName,Object value) {
		try {			
			PropertyUtils.setProperty(object, propertyName,value);
		} catch (Exception ex) {
			throw new RuntimeException();
		}
	}
	
	/**
	 * 设置字段值	
	 * @param obj          实例对象
	 * @param propertyName 属性名
	 * @param value        新的字段值
	 * @return          
	 */
	public static void setProperties(Object object, String propertyName,Object value) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName,object.getClass());
		Method methodSet = pd.getWriteMethod();
		methodSet.invoke(object,value);
	}
	
	
	/**
	 * 设置字段值
	 * @param propertyName 字段名
	 * @param obj          实例对象
	 * @param value        新的字段值
	 * @return          
	 */
	public static void setFieldValue(Object obj,String propertyName,Object value) {
		try {
			Field field = obj.getClass().getDeclaredField(propertyName);		
			field.setAccessible(true);
			field.set(obj, value);
		} catch (Exception ex) {
			throw new RuntimeException();
		}
	}
	
	/**
	 * 设置字段值
	 * @param className        类的全路径名称
	 * @param methodName       调用方法名
	 * @param parameterTypes   参数类型
	 * @param values           参数值
	 * @param object           实例对象
	 * @return          
	 */
	@SuppressWarnings("rawtypes")
	public static Object methodInvoke(String className,String methodName,Class [] parameterTypes,Object [] values,Object object) {
		try {
			Method method = Class.forName(className).getDeclaredMethod(methodName,parameterTypes);
			method.setAccessible(true);
			return method.invoke(object,values);
		} catch (Exception ex) {
			throw new RuntimeException();
		}
	}
}

/**
	 * @param <T> 具体对象
	 * @param fileds  要进行比较Bean对象的属性值集合(以属性值为key,属性注释为value,集合从数据库中取出)
	 * @param oldBean  源对象
	 * @param newBean  新对象
	 * @return 返回二个Bean对象属性值的异同
	 */
	public static <T> String compareBeanValue(Map<String,String> fileds,T oldBean,T newBean){
		
		StringBuilder compares = new StringBuilder();
		String propertyName = null;		
		Object oldPropertyValue = null;
		Object newPropertyValue = null;
		
		StringBuilder descrips = new StringBuilder();				
		for(Map.Entry<String, String> entity : fileds.entrySet()){
			//获取新旧二个对象对应的值
			propertyName = entity.getKey().toLowerCase();
			oldPropertyValue = getProperty(propertyName, oldBean);
			newPropertyValue = getProperty(propertyName, newBean);			
							
			if(null == oldPropertyValue && null == newPropertyValue){
				continue;
			}			
			if("".equals(oldPropertyValue) && "".equals(newPropertyValue)){
				continue;
			}			
			if(null == oldPropertyValue){
				oldPropertyValue = "";
			}			
			if(null == newPropertyValue){
				newPropertyValue = "";
			}			
			
			if(oldPropertyValue.equals(newPropertyValue)){			
				continue;
			}
			compares.append("字段注释: ").append(entity.getValue()).append("】").append("原属性值\"");
			if(StringUtils.isEmpty(oldPropertyValue+"")){
				oldPropertyValue = " ";
			}
			compares.append(oldPropertyValue).append("\"现属性值\"");
			if(StringUtils.isEmpty(newPropertyValue+"")){
				newPropertyValue = " ";
			}
			compares.append(newPropertyValue).append("\";");			
		}		
		return compares.toString();
	}



分享到:
评论
1 楼 javams 2015-03-24  
找了很久终于找到了,非常感谢,哈哈

相关推荐

    java反射工具类 ReflectionUtils

    该工具类下载后拷贝到你要用的包,只需该包名即可

    一个Java反射工具类,可以完成查询字段值以及设置字段值的功能

    一个Java反射工具类,可以完成查询字段值以及设置字段值的功能。

    java反射工具类

    java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符...只是个工具类,没有写测试类,自己测试下啊

    ReflectUtil java反射工具类

    ReflectUtil java反射工具类

    Java反射调用工具类

    这个“Java反射调用工具类”可能是为了简化和封装这些复杂的反射操作而创建的一个实用工具类。 首先,`JobProxy.java`可能是一个代理类,它利用反射来动态地调用目标对象的方法。在Java中,代理模式通常用于在不...

    java 反射工具类,适用于框架开发、平台建设等项目

    java 反射工具类,适用于框架开发、平台建设等项目

    java 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被...

    java反射机制工具类

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...

    java 反射注入工具类

    使用java 反射 将HttpServletRequest 中页面参数动态的注入到 javabean对象的辅助工具类,觉得还不错!

    Java 反射工具

    反射技术集合,针对对象的反射操作,包含:判断对象属性是否为空、清空对象、读取设置属性等等,比较实用

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具...

    反射工具类ReflectionUtils.java

    进行数据库查询操作经常用到,包括getDeclaredField、getDeclaredMethod、getFieldValue、getSuperClassGenricType、getSuperGenericType、invokeMethod、makeAccessible、setFieldValue

    java组件开发(13)反射工具类

    java组件开发(13)反射工具类

    牛逼的java常用工具类

    6. **反射API**:Java反射机制允许程序在运行时动态地获取类的信息(如类名、方法名)并调用它们,这在配置文件驱动的应用、插件系统和单元测试中十分有用。 7. **异常处理**:`Exception`类及其子类构成了Java的...

    java utils 工具类

    JavaUtils工具类是Java开发中常见的一类辅助代码集合,它们通常包含各种静态方法,用于简化常见的编程任务,提高开发效率。这篇博文链接(已提供但无法直接访问)可能详细探讨了JavaUtils工具类的设计原则、常用方法...

    Java常用工具类

    3. **Apache Commons Lang**:Apache软件基金会的一个开源项目,提供了大量扩展Java语言特性的工具类,如字符串处理、数组操作、反射、枚举操作等。 - `StringUtils`:提供了丰富的字符串操作方法,如空白字符处理...

    java常用工具类

    "java常用工具类"这个主题涵盖了Java开发中常用的类和方法,这些工具类可以帮助我们简化编程工作,提高代码的可读性和可维护性。在Java中,`java.util`包就是这样一个包含大量工具类的包,提供了很多实用的功能。 1...

Global site tag (gtag.js) - Google Analytics