`
vakin.jiang
  • 浏览: 147544 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

反射机制实现javaBeans自动赋值

    博客分类:
  • J2EE
阅读更多
开发中常常遇到两个beans相同字段之间值传递中大量的x.setXXXX(y.getXXX())语句;
字段多了比较繁琐,所以在这里就利用反射机制实现自动赋值。
考虑反射机制的效率问题,字段不多就手动设置更好。
/**
	 * javaBeans自动将相同字段值赋给给另外一个javaBeans
	 * @param src
	 * @param target
	 * @throws Exception
	 */
	public static void CopyBeans2Beans(Object src, Object target) throws Exception {
		Field[] srcFields = src.getClass().getDeclaredFields();

		Method[] methods = target.getClass().getMethods();

		for (Field field : srcFields) {
			
			//不检查访问修饰符,如果有私有变量请一定要设置
			field.setAccessible(true);
			String methodName = "set"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
			for (Method method : methods) {
				if(methodName.equals(method.getName()))
					method.invoke(target, field.get(src));
			}
		}

	}


另一种实现:
public static void CopyBeans2Beans(Object from, Object to) {
		
		try {
			BeanInfo toBI = Introspector.getBeanInfo(to.getClass());
			PropertyDescriptor[] toPD = toBI.getPropertyDescriptors();

			BeanInfo fromBI = Introspector.getBeanInfo(from.getClass());
			PropertyDescriptor[] fromPD = fromBI.getPropertyDescriptors();

			HashMap<String, PropertyDescriptor> fromMap = new HashMap<String, PropertyDescriptor>();
			for (PropertyDescriptor pd : fromPD)
				fromMap.put(pd.getName(), pd);

			for (PropertyDescriptor toP : toPD) {

				Method setMethod = toP.getWriteMethod();

				PropertyDescriptor formP = fromMap.get(toP.getName());
				if (formP == null)// 如果from没有此属性的get方法,跳过
					continue;

				Method getMethod = fromMap.get(toP.getName()).getReadMethod();

				if (getMethod != null && setMethod != null) {
					Object result = getMethod.invoke(from);
					
					if(result==null)
						continue;
					
					if(result.getClass()!= java.lang.String.class)
						continue;
					setMethod.invoke(to, result);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
0
0
分享到:
评论
2 楼 sikeh 2009-10-25  
Apache Commons BeanUtils...
1 楼 redish 2009-08-10  
common包有个BeanUtil工具,很不错!

相关推荐

    commons-beanutils-1.8.0-src

    首先,BeanUtils的核心功能是通过反射机制实现Bean的属性操作。在Java中,Bean通常是指符合JavaBeans规范的对象,具备getter和setter方法,用于封装数据。BeanUtils提供的API使得我们无需直接调用这些方法,而是通过...

    beanutils JAR包下载

    2. **动态属性访问(Dynamic Property Access)**:即使没有对应的getter或setter方法,BeanUtils也能通过反射机制访问和修改对象的属性。这使得开发者可以处理那些未公开完整接口的对象。 3. **类型转换(Type ...

    beanutils源码

    6. introspection机制:BeanUtils利用Java的反射API(Reflection API)来动态地获取和设置Bean的属性。反射使得在运行时可以检查类的信息,如方法、字段和构造函数,并能调用它们。 7. 设计模式:BeanUtils源码中...

    BeanUtils包

    这些方法通过反射机制自动找到对应的setter或getter方法,并执行相应的操作。 2. **批量属性赋值:** 使用`populate()`方法,可以一次性将Map中的键值对映射到Bean的属性上,极大地提高了数据绑定的效率。 3. **...

    BeanUtils工具类的Jar包

    此外,它还支持动态属性访问,即使属性不存在,也能尝试通过反射机制来调用。这在处理大量数据对象或者需要进行数据转换时非常有用。 `commons-logging-1.1.1.jar`则是Apache Commons Logging的实现,这是一个日志...

    commons-beanutils

    BeanUtils库通过反射机制实现了对这些对象的属性操作,包括读取、设置属性值以及复制对象属性等。 **二、核心功能** 1. **属性访问**:BeanUtils提供了一系列静态方法,如`getProperty()`和`setProperty()`,可以...

    commons-beanutils-1.8.0.jar

    BeanUtils库通过反射机制,简化了对JavaBeans属性的操作,使得代码更加简洁且易于维护。 二、主要功能 1. 属性访问:BeanUtils提供了一系列静态方法,如`getProperty()`和`setProperty()`,可以直接通过对象名和...

    BeanUtil Jar包

    例如,通过`BeanUtil.setProperty(obj, "propertyName", value)`,我们可以直接对对象的"propertyName"属性赋值,而无需调用`setPropertyName()`方法。 2. **批量属性复制**:BeanUtil还提供了`copyProperties()`...

    BeanUtils.jar

    BeanUtils.jar主要包含了Apache Commons BeanUtils库,这是一个基于Java反射机制的工具库,它提供了对JavaBean属性的便捷访问和操作。通过这个库,开发者可以避免编写大量的getter和setter方法,提高代码的可读性和...

    良葛格java jdk 5.0学习笔记

    通过JavaBeans API和反射机制,JDK 5.0提供了更强大的内省能力,可以动态获取类的信息,如属性、方法等,便于在运行时操作对象。 10. **静态导入**: 静态导入允许一次性导入某个类的所有静态成员,避免了使用...

    javabean基础知识

    - **具有无参构造函数**:这是JavaBean的基本要求之一,确保可以通过反射等机制创建JavaBean实例。 - **使用get/set方法访问其属性**:JavaBean的属性通常遵循JavaBeans规范,即通过get和set方法来访问和修改。 ...

    java笔记 java笔记 java笔记

    - **语法特性**:Java遵循C++的语法结构,但更加简洁和安全,如自动内存管理(垃圾回收)。 - **数据类型**:包括基本类型(如int、char、boolean)和引用类型(类、接口、数组)。 - **变量与常量**:声明变量前...

    Java程序员面试宝典(完整版)

    - **反射机制**: 使用反射API来操作类、字段、方法等。 - **泛型**: 泛型类、泛型方法、通配符等。 - **Java新特性**: 如Java 8中的Lambda表达式、Stream API等。 通过掌握这些知识点,Java程序员不仅能够应对面试...

    Java经典面试

    - 第二种情况下,`s1+=1`会自动进行类型转换,将结果赋值回`short`类型,因此不会出错。 #### 17. Math.round(11.5)与Math.round(-11.5)的结果 - `Math.round(11.5)`返回`12`,`Math.round(-11.5)`返回`-11`,因为`...

    JAVA学习讲义

    - **运算符**: 包括算术、关系、逻辑、位和赋值运算符。 - **控制流程**: 如if-else语句、switch case、for、while和do-while循环,以及break和continue语句。 **2. 类与对象** - **类**: 是Java中的蓝图,定义...

    javaPPT

    - **垃圾回收**:自动内存管理,理解GC机制。 - **JVM调优**:使用JVisualVM等工具优化性能。 12. **Spring框架**: - **依赖注入**:IoC容器管理组件间的依赖关系。 - **AOP(面向切面编程)**:处理横切关注...

    java笔记--

    例如,Java使用垃圾回收机制自动管理内存,避免了C++中的内存泄漏问题。 - **类与对象**:Java是面向对象的语言,一切皆为对象。类是创建对象的模板,对象则是类的实例。 - **封装**:通过访问修饰符控制数据的...

    JAVA基础面试大全.doc corejavanetbook.doc jsp技术大全.pdf

    - **MVC(Model-View-Controller)**:JSP在MVC架构中的角色,以及如何配合Servlet和JavaBeans实现。 - **JSP和Servlet容器**:如Tomcat,Jetty等,它们如何解析和执行JSP页面。 4. **JAVA设计模式.chm**:设计...

    Java开发技术大全 电子版

    2.4.6赋值运算符和赋值表达式53 2.4.7表达式的求值顺序55 2.5流程控制语句58 2.5.1三种基本控制结构58 2.5.2表达式语句和空语句59 2.5.3块语句60 2.5.4if~else分支语句61 2.5.5多路分支switch~case语句69 ...

Global site tag (gtag.js) - Google Analytics