`
明子健
  • 浏览: 574001 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java反射-BeanUtil

    博客分类:
  • Java
阅读更多
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;
	}
}

 

分享到:
评论

相关推荐

    common-beanutil源代码

    common-beanutil的源代码 1.8.1

    commons-beanutil-1.7.0-src

    apache beanutil 1.7代码

    commons-beanutils-1.9.CHM

    Commons-beanutil中包括大量和JavaBean操作有关的工具方法,使用它能够轻松利用Java反射机制来完毕代码中所须要的功能,而不须要具体研究反射的原理和使用,同一时候,该类库中提出了动态Bean的概念,不但提供现有...

    BeanUtil.java

    BeanUtil.java

    commons-beanutils.jar

    commons-beanutils.jar.zip ,学习过程可能需要用到的jar包

    BeanUtil属性拷贝工具类

    BeanUtil属性拷贝工具类,支持基本的javabean属性拷贝,通过java反射和泛型编程实现了list属性拷贝

    使用XLSTransformer生成报表

    使用XLSTransformer生成XLS报表的jar包: jxls-core-0.9.7.jar jxls-reader-0.9.7.jar poi-3.6.jar commons-jexl-1.1.jar commons-digester-2.0.jar commons-beanutil-core-1.8.3.jar commons-collection.jar

    json.常用工具

    json开发工具jar包必备commons-colloections-3.2.1.jar commons-logging-1.1.1.jar commons-beanutil.jar commons-httpclient.jar commons-lang.jar ezmorph-1.0.6.jar json-lib-2.4-jdk15.jar morph-1.1.1.jar

    BeanUtil工具类

    BeanUtil 主要用于实体Bean和Map之间的互转,使用方便,是一个不可多得的工具类哦

    commons-beanutils

    Commons-beanutil中包括大量和JavaBean操作有关的工具方法,使用它能够轻松利用Java反射机制来完毕代码中所须要的功能,而不须要具体研究反射的原理和使用,同一时候,该类库中提出了动态Bean的概念,不但提供现有...

    json-lib jar包 源代码

    里面包括要使用 json-lib 所要用到的所有包。另外还有 json-lib 的源码。可以在 eclipse 里查看源码。 commons-logging.jar commons-lang.jar commons-beanutil.jar commons-collections.jar ezmorph.jar

    msssqlserver.jar\jspsmartupload.jar\classes.jar\jsf--api\jsf-impl.jar

    standard.jar msutil.jar mssqlserver.jar msbase.jar jstl.jar jspsmartupload.jar jsf-impl.jar jsf-api.jar classes.jar commons-digester.jar commons-collections.jar commons-beanutil.jar

    beanutils中文API.doc

    Commons-beanutil中包含大量和JavaBean操作有关的工具方法,使用beanutils可轻松利用Java反射机制来完成所需功能,而不需要详细研究反射的原理和使用,同时beanutils类库中提出了动态Bean的概念,可在运行时动态对...

    beanutil数据库操作工具

    beanutil数据库操作工具,beanutil数据库操作工具

    BeanUtil框架完整包

    BeanUtil框架完整包

    BeanUtil.rar

    BeanUtil需要的jar包和源码文件,commons-beanutils-1.8.0.jar,commons-beanutils-1.8.0-javadoc.jar,commons-beanutils-1.8.0-sources.jar,commons-beanutils-bean-collections-1.8.0.jar,commons-beanutils-...

    BEANutil工具类,可获取生日

    BEANutil工具类,可获取生日,简单的几行代码,给需要的你。BEANutil工具类,可获取生日,简单的几行代码,给需要的你。

    改进的BeanUtil包

    修改了org.apache.commons.beanutils.converters包下的StringConverter类 3.ConvertUtilsBean类中的public void deregister()方法末尾下加入了register(java.util.Date.class, new UtilDateConverter());...

Global site tag (gtag.js) - Google Analytics