`

类似spring的java反射赋值bean

阅读更多

前段时间使用spring做数据映射,奈何公司就是不喜欢用这些框架,总说不适用。。。

我就崩溃,java也就这么几个经典的框架,别人都适合怎就你不适合,--冷静--

 

之后因为解析xml写得太烂了,就借鉴spring的反射,写了个反射的工具类,用做xml反射到实体bean属性。

代码放出来,不是想得瑟,因为写的也没什么。而且因为没见过spring resource,更是写得不知好坏,想哪写哪

 

package com.logi.lpromis.mapping.xml;

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

import org.apache.log4j.Logger;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

public class XMLPropertyReflection
{
	private static final Logger logger = Logger.getLogger(XMLPropertyReflection.class);
	/**
	 * 获取类属性值
	 * @param bean 类
	 * @param filename 类属性名
	 * @return 类属性
	 * @throws Exception
	 */
	public static Object getProperty(Object bean,String filename) throws Exception
	{
		Class<? extends Object> beanClass = bean.getClass();
		Field field = beanClass.getDeclaredField(filename);
		field.setAccessible(true);
		Object property = field.get(bean);//获得属性
		return property;
	}
	
	/**
	 * 设置类属性
	 * @param bean 类
	 * @param filename 类名
	 * @param filevalue 新类属性值
	 * @throws Exception
	 */
//	public static void setProperty(Object bean,String filename,String filevalue) throws Exception
//	{
//		try{
//		Class<? extends Object> beanClass = bean.getClass();
//		Field field = beanClass.getDeclaredField(filename);
//		field.setAccessible(true);
//		Object value = ConvertHandler(field.getType(),filevalue);//转换属性
//		field.set(bean, value);//设置属性
//		}
//		catch (Exception e)
//		{
//			if(e instanceof NoSuchFieldException)
//			{
//				logger.error("类中缺少类型"+filename);
//				logger.error(e);
//			}
//			else
//				throw e;
//		}
//	}
	
	/**
	 * 转换类属性值
	 * @param type 类中属性类型
	 * @param filevalue 类属性新值String类型
	 * @return 类属性新值
	 * @throws Exception
	 */
	public static Object ConvertHandler(Class<?> type,String filevalue) throws Exception
	{
		String typename = type.getName();
		if(filevalue.getClass().getName().equals(typename))
			return filevalue;//与所给类型值相同
		else if("Boolean".equalsIgnoreCase(typename) || "java.lang.Boolean".equals(typename))
		{
			//boolean型
			if(filevalue.equalsIgnoreCase("true") || filevalue.equals("1"))
				return new Boolean(true);
			else
				return new Boolean(false);
		}
		else if("int".equalsIgnoreCase(typename) || "Integer".equals(typename) || "java.lang.Integer".equals(typename))
			return new Integer(filevalue);//int 型
		else if("String".equalsIgnoreCase(typename) || "java.lang.String".equals(typename))
			return new String(filevalue);//String 型
		else
		{
			throw new Exception("xml转换类型不支持"+typename+",需要扩展XMLPropertyReflection的ConvertHandler");//不支持所给类型,需要修改XMLPropertyReflection的ConvertHandler
		}
	}
	
	/**
	 * 设置类属性
	 * @param bean 类
	 * @param filename 类名
	 * @param filevalue 新类属性值
	 * @throws Exception
	 */
	public static void setProperty(Object bean,String fileName,String fileValue) throws Exception
	{
		try
		{
			Class<? extends Object> beanClass = bean.getClass();
			//查找set方法
			String fieldName = fileName.substring(0,1).toUpperCase()+fileName.substring(1);
			String setFieldName = "set"+fieldName;//获取set方法名
			String getFieldName = "get"+fieldName;//获得get方法名
			Method getMethod = beanClass.getMethod(getFieldName);//获取获取方法
			Class<?> propertyType = getMethod.getReturnType();//获取属性类型
			Method setMethod = beanClass.getMethod(setFieldName,new Class[]{propertyType});
			Object value = ConvertHandler(propertyType,fileValue);//获得新值value
			setMethod.invoke(bean, new Object[]{value});
		}
		catch (Exception e)
		{
			if(e instanceof NoSuchMethodException)
			{
				logger.error("类中缺少类型" + fileName, e);
			}
			else
				throw e;
		}
	}
	
	public static void setProperty(Object object,Element ele) throws Exception
	{
		NamedNodeMap attributeMap = ele.getAttributes();
		for (int i = 0; i < attributeMap.getLength(); i++)
		{
			Node cataNode = attributeMap.item(i);
			XMLPropertyReflection.setProperty(object, cataNode.getNodeName(), cataNode.getNodeValue());
		}
	}
}

 写得不好,请多指教。其中getDeclaredField方法无法拿到父类属性,所以只能用getmethod方法,去拿公共方法

1
0
分享到:
评论

相关推荐

    java反射Demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理现实业务问题时尤其有用,例如实现插件化、元编程、动态代理等...

    利用反射实现JavaBean 的自动赋值

    ### 利用反射实现JavaBean的自动赋值 在软件开发过程中,特别是在Web应用程序的开发中,经常会遇到需要将表单提交的数据绑定到JavaBean对象上的需求。这可以通过多种方式实现,例如使用Spring MVC等框架的自动绑定...

    Spring bean 管理

    - class:用于指定Bean所对应的完整类名,Spring通过反射来创建该类的实例。 3. Bean的作用域: - singleton:默认的作用域,表示容器中只有一个Bean实例。 - prototype:每次请求都创建一个新的Bean实例。 - ...

    Spring Bean生命周期.pdf

    在实例化阶段,Spring容器利用反射机制根据Bean的定义信息创建对象实例。这一过程通常涉及构造器的调用,但也可以通过工厂方法或静态工厂方法实现Bean的实例化。 2. 属性赋值(Population) 属性赋值阶段,Spring...

    java 反射对XML的解析

    这在配置驱动的设计模式中非常常见,比如Spring框架就是通过这种方式加载配置文件,初始化bean并管理其生命周期。 以下是一个简单的示例,展示了如何使用Java反射解析XML: ```java import java.io.File; import ...

    Java EE 框架整合 开发入门到实战-Spring+Spring MVC+MyBatis微课版复习笔记

    - Spring框架使用Java的反射机制来实现依赖注入,具体是通过构造器注入和属性注入(基于属性和方法)的方式。 Bean的实例化: - 在Spring框架中,Bean的实例化可以通过三种方式完成:构造方法实例化、静态工厂实例...

    Spring源码分析.docx

    例如,如果 BeanDefinition 对象定义了一个 JavaBean,Spring 框架会使用 Java 反射机制创建一个新的 JavaBean 实例。 5. 到达填充属性,对属性赋值 在实例化完成后,Spring 框架会对 Bean 对象进行属性赋值。在这...

    Java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制的核心在于Java.lang.reflect包,提供了Class、Constructor、Method和Field等类,用于获取类的信息...

    2022年品味Spring 的魅力Java教程.docx

    通过BeanWrapper,开发者可以方便地操作Bean,无论是简单的属性赋值,还是复杂的嵌套属性处理,甚至是方法调用,都能得以实现。 例如,在给定的代码示例中,我们创建了一个`Company`和一个`Employee`对象,然后使用...

    Spring.pdf

    Spring容器启动时会根据配置文件来创建Bean实例,并且利用反射机制调用相应的setter方法为属性赋值。这种方式降低了组件之间的耦合度,因为对象不再需要自己查找或创建与其相互协作的对象,而是通过容器来注入它们。...

    spring ioc使用教程

    Spring支持泛型Bean,可以通过反射机制获取泛型的实际类型,方便管理和操作。 14. **Spring JUnit单元测试**: 结合Spring和JUnit进行单元测试,可以通过`@ContextConfiguration`加载配置,`@Autowired`注入依赖...

    Java - Spring-IoC(Inverse of Control)–> 控制反转

    Spring是一个由Rod Johnson创建的轻量级Java开发框架,它为Java应用程序提供了全面的基础架构支持。Spring的核心目标在于简化企业级应用的开发过程,降低开发难度的同时提高了开发效率。Spring框架不仅在Java社区中...

    SpringBoot (4.71G)精华详解

    1.Spring核心讲解与内容详述.mp4;`-{0B:r2E;]$u+m 2.Spring源码环境搭建与执行流程解析.mp4/j1};W;T$w4J8L2C5B.s 3.Spring核心组件装配流程解析.mp4)v!aq1n6}(D*K'b+V[1a ...15.Spring对象属性赋值与作用域源码解

    spring aop的jar包

    4. **org.springframework.core-3.0.5.RELEASE.jar**:这是Spring的核心库,包含了基本的类型转换、反射、集合操作等基础工具类,是Spring框架的基石。 5. **org.springframework.aop-3.0.5.RELEASE.jar**:这个...

    Spring + SpringMVC + Mybatis总结,同步博客中的pdf文档

    IoC 容器通过读取配置文件,解析XML,然后使用Java的反射机制实例化配置的bean,并根据配置完成对象的初始化和依赖注入。在处理引用类型的成员变量时,可以通过`ref`属性指定其依赖的对象,实现对象间的关联。 ...

    StudyIdeaProject.rar

    Spring通过反射和元数据来自动装配Bean的依赖,使得代码更加松耦合,易于测试和维护。 综上所述,“StudyIdeaProject”项目将带你全面探索Spring框架的内在机制,从扫描、解析到Bean的创建和管理,再到AOP和依赖...

    Spring MVC依赖Jar包下载

    5. **spring-expression.jar**(通常与spring-context一起打包):提供了强大的表达式语言(SpEL),用于在运行时查询和操作对象图,常用于Bean属性的动态赋值和AOP的切入点表达式。 6. **spring-aop.jar**:提供...

    Spring框架笔记

    Spring框架作为一个开源的轻量级框架,主要应用于Java企业级应用的开发。随着版本的迭代,Spring框架的功能不断丰富和完善,成为Java领域内最受欢迎的企业级开发框架之一。 #### Spring的核心组成 Spring的核心...

    SpringIOC、AOP、注解等相关的详细解释(附有代码贴图)

    例如,Spring容器实例化一个person对象和一个student对象,通过Java的反射机制调用setter方法为属性赋值,从而完成依赖关系的注入。 注解是Java 5.0引入的特性,它提供了一种新的方式来声明元数据。在Spring中,...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.20.docx

    1. **Java反射**:Java反射是Java语言提供的一种机制,允许程序在运行时检查类的内部结构,如字段、方法、构造器等,并能动态调用方法和修改属性。在实际开发中,反射主要用于框架设计、测试工具、序列化/反序列化...

Global site tag (gtag.js) - Google Analytics