`
明子健
  • 浏览: 576825 次
  • 性别: 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;
	}
}

 

分享到:
评论

相关推荐

    commons-beanutil-1.7.0-src

    这个"commons-beanutil-1.7.0-src"压缩包包含了BeanUtils库的源代码,版本号为1.7.0,是开发者理解和自定义此库功能的重要资源。以下是关于Apache Commons BeanUtils库及其1.7.0版本的一些关键知识点: 1. **...

    commons-beanutils-1.9.CHM

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

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作.docx

    "Java反射 JavaBean 对象自动生成插入、更新、删除、查询sql语句操作" Java反射JavaBean对象自动生成插入、更新、删除、查询sql语句操作是指通过Java反射机制,依据提供的表名、POJO类型、数据对象自动生成sql语句...

    BeanUtil框架完整包

    4. **反射操作**:BeanUtils库利用Java反射API,使得开发者无需直接编写反射代码,就能执行基于属性名的方法调用。 5. **处理集合和数组**:对于Bean中包含集合或数组的属性,BeanUtils也提供了相应的处理方法,...

    BeanUtil属性拷贝工具类

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

    BeanUtil Jar包

    《BeanUtil:Apache提供的高效Java反射工具包》 在Java编程中,BeanUtil是一个非常重要的工具包,尤其在处理对象的属性操作时,它扮演着不可或缺的角色。BeanUtil源自著名的开源组织Apache,是其 Commons BeanUtils...

    BeanUtil1.8 SRC 源码和 jar包

    BeanUtil是Apache Commons项目中的一个工具类库,主要用于处理Java Bean的操作,提供了一系列便捷的方法来简化Java Bean的属性操作。在这个"BeanUtil1.8 SRC 源码和 jar包"中,包含两个重要的文件:`commons-...

    commons-beanutils

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

    BeanUtil与Logging

    在Java开发中,BeanUtil和Logging是两个非常重要的工具库,它们在许多项目中都扮演着核心角色。这里我们将深入探讨这两个概念以及它们在实际应用中的使用。 首先,BeanUtil通常指的是Apache Commons BeanUtils库,...

    BeanUtil_MYSQL_mybaatis_

    1. 反射:使用Java的反射API获取Bean的所有字段和它们的值。 2. SQL构建:根据字段生成SQL语句,注意处理NULL值和特殊类型(如日期)。 3. MyBatis整合:可能需要结合MyBatis的Mapper接口或XML配置,将生成的SQL语句...

    Servlet中对获取网页表单数据自动给JavaBean赋值的BeanUtil工具类

    总的来说,BeanUtil工具类是Java Web开发中的实用工具,它简化了Servlet处理表单数据和JavaBean之间数据转换的过程,让代码更简洁、更易于维护。在学习和使用BeanUtil时,还需要了解其潜在的类型转换问题和安全性...

    beanutil源代码

    总的来说,"beanutil源代码"和"fileupload"都是Java Web开发中的实用工具,前者简化了JavaBean对象的交互,后者则提供了强大的文件上传处理能力。将两者结合,可以高效地实现复杂的业务逻辑,如用户上传文件并保存...

    commons.zip

    它通过反射机制,实现了属性的自动赋值和获取,大大降低了代码的复杂性。例如,`CommonUtils`类中的`uuid生成随机数`可能利用了BeanUtils的特性,生成一个唯一的标识符,这个标识符在数据库操作或者对象识别中非常...

    XML2Bean

    它通过反射机制将XML映射到Java对象,并能将Java对象序列化为XML。在XStream中,这个过程是通过定义一个或多个Java类(Bean)来完成的,这些类代表了XML文档的结构。当XML数据被解析时,XStream会创建或更新相应的...

    hutool框架代码

    一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件: 布隆过滤 缓存 克隆接口 类型转换 日期处理 数据库ORM(基于...

    Java常用工具包 Jodd

    10. **其他工具**:除了以上核心功能,Jodd还包括了诸如缓存、反射、加密解密、异常处理、模式匹配等多种实用工具,全面覆盖了日常开发的各个方面。 Jodd的源码软件结构清晰,易于理解和扩展,对于想要深入学习Java...

    BeanUtils依赖Jar包与源码.rar

    4. **反射辅助**:通过BeanUtils,开发者可以利用反射机制,方便地处理未知类型的Bean。 5. **日志记录**:通过commons-logging,开发者可以方便地添加和调整日志系统,以便于调试和问题排查。 综上所述,...

    一种简单的json解析方法

    本篇文章将介绍一种基于Java的基本JSON解析方法,通过提供的`JsonUtil.java`、`BeanUtil.java`和`AjaxResponse.java`三个文件,我们可以看到如何实现这一功能。 `JsonUtil.java`文件很可能是包含解析和序列化JSON的...

    Hutool Java开发工具包 v3.2.0

    此外,Hutool的ClassUtil和BeanUtil简化了Java反射操作,方便了类的实例化和属性的设置与获取。而RegexUtil则提供了正则表达式的便利操作,使匹配和替换字符串变得更加简单。 总之,Hutool v3.2.0作为一个全面的...

Global site tag (gtag.js) - Google Analytics