类似spring的java反射赋值bean

news/2024/5/19 5:19:45 标签: java, spring, 反射, 初始化bean

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

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

 

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

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

 

java">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方法,去拿公共方法


http://www.niftyadmin.cn/n/1695800.html

相关文章

大型网站技术架构(一):大型网站架构演化

大型网站软件体系系统的特点 高并发&#xff0c;大流量高可用&#xff1a;系统7*24小时不间断服务海量数据&#xff1a;需要存储、管理海量数据&#xff0c;需要使用大量服务器用户分布广泛&#xff0c;网络情况复杂&#xff1a;许多大型互联网都是为全球用户提供服务的&#x…

201671010460朱艺璇《英文文本统计分析》结对项目报告

实验四 《英文文本统计分析》结对项目报告. 项目内容这个作业属于哪个课程http://www.cnblogs.com/nwnu-daizh/这个作业的要求在哪里https://www.cnblogs.com/nwnu-daizh/p/10569690.html课程学习目标熟悉软件开发整体流程&#xff0c;提升自身能力本次作业在哪个具体方面帮助我…

mysql存储过程 预处理

在做oracle转mysql的是否&#xff0c;总觉得mysql一无是处&#xff0c;便宜没好货&#xff0c;可是mysql也是有自己的优势的&#xff0c;或是说他们的语法&#xff0c;偏向不同 下面就说一个mysql的预处理功能&#xff0c;举了简单的实例&#xff1a; BEGIN-- DECLARE dbsql va…

linux下postgres的安装

软件包的下载 在浏览器中访问https://www.enterprisedb.com/download-postgresql-binaries 然后选择适合自己的版本&#xff0c;我选择的是linux64位下的10.0.7版本&#xff0c;下载后得到一下的包&#xff1a;postgresql-10.7-1-linux-x64-binaries.tar.gz 安装并初始化 解压并…

Ibatis插件ibator下载

Ibatis框架的eclipse插件-ibator,最近ibator下载地址总是打不开&#xff0c;所以将一个老版本的ibator插件挂上&#xff0c;大家凑合用吧 虽然是老版本3.0.6&#xff0c;但是自动生成代码的功能俱全&#xff0c;但是是老版本&#xff0c;一些数据库类型不识别&#xff0c;如ora…

php函数中static静态变量

http://www.cnblogs.com/52php/p/5658168.html https://www.cnblogs.com/lin3615/p/3806089.html转载于:https://www.cnblogs.com/goodyunl/p/10648884.html

scrapy 爬虫的暂停与重启

暂停爬虫项目 首先在项目目录下创建一个文件夹用来存放暂停爬虫时的待处理请求url以及其他的信息.(文件夹名称:job_info) 在启动爬虫项目时候用pycharm自带的终端启动输入下面的命令: scrapy crawl (爬虫名) -s JOBDIRjob_info/(再让其自动的创建一个文件夹用于存放不同的爬虫重…