`
liufei.fir
  • 浏览: 675961 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

定义一个java类型转换器

阅读更多
1、相关接口
package org.liufei.jweb.reflection.type;

/**
 * 
 * @author 刘飞
 *
 * @param <T>
 */
public interface TypeHandler {

	public Object getValue(Object value);

}

2、转换器工具
package org.liufei.jweb.reflection.type;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.liufei.jweb.reflection.type.http.HttpServletRequestTypeHandler;
import org.liufei.jweb.reflection.type.http.HttpServletResponseTypeHandler;
import org.liufei.jweb.reflection.type.http.HttpSessionTypeHandler;
import org.liufei.jweb.reflection.type.http.ServletContextTypeHandler;
import org.liufei.jweb.util.Assert;

public class JavaTypeHandlers {
	private static transient final Logger logger = Logger
			.getLogger(JavaTypeHandlers.class);

	private static final Map<Class<?>, TypeHandler> TYPE_HANDLERS = new HashMap<Class<?>, TypeHandler>();
	
	private static final Class<?>[] HTTP_SERVLET_API_CLASSES = new Class<?>[]{
		ServletContext.class,
		ServletRequest.class,
		ServletResponse.class,
		HttpServletRequest.class,
		HttpServletResponse.class,
		HttpSession.class
	} ;

	static {
		try {
			TYPE_HANDLERS.put(int.class, IntegerHandler.class
					.newInstance());
			TYPE_HANDLERS.put(Integer.class, IntegerHandler.class
					.newInstance());

			TYPE_HANDLERS.put(boolean.class, BooleanHandler.class
					.newInstance());
			TYPE_HANDLERS.put(Boolean.class, BooleanHandler.class
					.newInstance());

			TYPE_HANDLERS.put(long.class, LongHandler.class
					.newInstance());
			TYPE_HANDLERS.put(Long.class, LongHandler.class
					.newInstance());

			TYPE_HANDLERS.put(float.class, FloatHandler.class
					.newInstance());
			TYPE_HANDLERS.put(Float.class, FloatHandler.class
					.newInstance());

			TYPE_HANDLERS.put(double.class, DoubleHandler.class
					.newInstance());
			TYPE_HANDLERS.put(Double.class, DoubleHandler.class
					.newInstance());

			TYPE_HANDLERS.put(char.class, CharacterHandler.class
					.newInstance());
			TYPE_HANDLERS.put(Character.class,
					CharacterHandler.class.newInstance());

			TYPE_HANDLERS.put(short.class, ShortHandler.class
					.newInstance());
			TYPE_HANDLERS.put(Short.class, ShortHandler.class
					.newInstance());

			TYPE_HANDLERS.put(byte.class, ByteHandler.class
					.newInstance());
			TYPE_HANDLERS.put(Byte.class, ByteHandler.class
					.newInstance());

			TYPE_HANDLERS.put(String.class, StringHandler.class
					.newInstance());

		} catch (InstantiationException e) {
			logger.error("init TypeHandler failed.", e);
			throw new RuntimeException("init TypeHandler failed.", e) ;
		} catch (IllegalAccessException e) {
			logger.error("init TypeHandler failed.", e);
			throw new RuntimeException("init TypeHandler failed.", e) ;
		}
	}
	
	public TypeHandler getUnsupportedDataHandler(Class<?> fieldType) {
		return new UnsupportedDataHandler(fieldType);
	}
	
	/**
	 * 扩展用户自定义的类型注入插件。
	 * @param typeHandlerMap
	 */
	public static void register(Map<Class<?>, TypeHandler> typeHandlerMap) {
		Assert.notNull(typeHandlerMap) ;
		if(typeHandlerMap == null) {
			return ;
		}
		logger.debug("\n\tregister TypeHandler map : " + typeHandlerMap + "\n") ;
		if(typeHandlerMap.size() > 0) {
			TYPE_HANDLERS.putAll(typeHandlerMap) ;
		}
	}
	
	/**
	 * 扩展用户自定义的类型注入插件。
	 * @param clazz
	 * @param typeHandler
	 */
	public static void register(Class<?> clazz, TypeHandler typeHandler) {
		Assert.notNull(clazz) ;
		Assert.notNull(typeHandler) ;
		if(clazz == null || typeHandler == null) {
			return ;
		}
		logger.debug("\n\tregister TypeHandler " + clazz + " = " + typeHandler.getClass() + "\n") ;
		TYPE_HANDLERS.put(clazz, typeHandler) ;
	}
	
	/**
	 * 扩展用户自定义的类型注入插件。
	 * @param classes 一般是该类的父类和接口组成的数组。
	 * @param typeHandler
	 */
	public static void register(Class<?>[] classes, TypeHandler typeHandler) {
		Assert.notNull(classes) ;
		Assert.notNull(typeHandler) ;
		Assert.notEmpty(classes) ;
		if(classes == null || typeHandler == null){
			return ;
		}
		logger.debug("\n\tregister multiple classes ( size = " + classes.length + " ) TypeHandler " + typeHandler.getClass() + " begin...\n") ;
		if(classes.length > 0) {
			int i = 1 ;
			for (Class<?> clazz : classes) {
				logger.debug("\n\t[" + i + "] register TypeHandler " + clazz + " = " + typeHandler.getClass() + "\n") ;
				TYPE_HANDLERS.put(clazz, typeHandler) ;
				i++ ;
			}
		}
		logger.debug("\n\tregister multiple classes ( size = " + classes.length + " ) TypeHandler " + typeHandler.getClass() + " end...\n") ;
	}
	
	/**
	 * 卸载类型转换插件
	 * @param typeHandlerMap
	 */
	public static void unInstall(Map<Class<?>, TypeHandler> typeHandlerMap) {
		Assert.notNull(typeHandlerMap) ;
		if(typeHandlerMap == null) {
			return ;
		}
		logger.debug("\n\tunInstall TypeHandler map " + typeHandlerMap + "\n") ;
		if(typeHandlerMap.size() > 0) {
			for (Object key : typeHandlerMap.keySet()) {
				typeHandlerMap.remove(key) ;
			}
		}
	}
	
	/**
	 * 卸载类型转换插件
	 * @param classes
	 */
	public static void unInstall(Class<?>... classes) {
		Assert.notNull(classes) ;
		if(classes == null) {
			return ;
		}
		if(classes.length > 0) {
			for (Class<?> clazz : classes) {
				logger.debug("\n\tunInstall TypeHandler for class " + clazz + "\n") ;
				TYPE_HANDLERS.remove(clazz) ;
			}
		}
	}
	
	/**
	 * 注册Servlet API相关对象。
	 * @param request
	 * @param response
	 * @param sessionCreate 由 HttpServletRequest 获取 HttpSession 时用到
	 * {@link javax.servlet.http.HttpServletRequest#getSession(boolean)}
	 * 
	 */
	public static void httpServletRegister(HttpServletRequest request,
			HttpServletResponse response, boolean sessionCreate) {
		httpServletRegister(request, response, request.getSession(sessionCreate), request.getSession(sessionCreate).getServletContext()) ;		
	}
	
	/**
	 * 注册Servlet API相关对象。
	 * @param request
	 * @param response
	 * @param session
	 * @param servletContext
	 */
	public static void httpServletRegister(HttpServletRequest request,
			HttpServletResponse response, HttpSession session, ServletContext servletContext) {
		Assert.notNull(request) ;
		Assert.notNull(response) ;
		Assert.notNull(session) ;
		Assert.notNull(servletContext) ;
		logger.debug(
				"\n\tregister httpServlet api args TypeHandler [ " + 
				HttpServletRequest.class + 
				", " +
				HttpServletResponse.class +
				", " +
				ServletRequest.class +
				", " +
				ServletResponse.class +
				", " +
				HttpSession.class +
				", " +
				ServletContext.class +
				" ].\n"
				) ;
		register(HttpServletRequest.class, new HttpServletRequestTypeHandler(request)) ;
		register(HttpServletResponse.class, new HttpServletResponseTypeHandler(response)) ;
		
		register(ServletRequest.class, new HttpServletRequestTypeHandler(request)) ;
		register(ServletResponse.class, new HttpServletResponseTypeHandler(response)) ;
		
		register(HttpSession.class, new HttpSessionTypeHandler(session)) ;
		register(ServletContext.class, new ServletContextTypeHandler(servletContext)) ;
		
	}
	
	public static void removeHttpServletRegister() {
		logger.debug(
				"\n\tunInstall httpServlet api args TypeHandler [ " + 
				HttpServletRequest.class + 
				", " +
				HttpServletResponse.class +
				", " +
				ServletRequest.class +
				", " +
				ServletResponse.class +
				", " +
				HttpSession.class +
				", " +
				ServletContext.class +
				" ].\n"
				) ;
		unInstall(HTTP_SERVLET_API_CLASSES) ;
	}
	
	/**
	 * 
	 * @param value
	 *            需要转化的值
	 * @param clazz
	 *            要转化的类型
	 * @return
	 */
	public static Object convertValueToType(Object value, Class<?> clazz) {
		logger.debug("\n\tconvert value " + value + "( type : " + value.getClass().getName() + ")" + " to type " + clazz.getName() + "\n") ;
		TypeHandler typeHandler = null ;

		typeHandler = TYPE_HANDLERS.get(clazz);
		if(typeHandler != null) {
			return typeHandler.getValue(value);
		}
		else if(typeHandler == null) {//接口、父类
			Class<?>[] clazzs = clazz.getInterfaces() ;
			for (Class<?> clazzi : clazzs) {
				typeHandler = TYPE_HANDLERS.get(clazzi);
				if(typeHandler != null) {
					return typeHandler.getValue(value);
				}
			}
			Class<?> superclazz = clazz.getSuperclass() ;
			typeHandler = TYPE_HANDLERS.get(superclazz);
			if(typeHandler != null) {
				return typeHandler.getValue(value);
			}
		}
		
		if (typeHandler == null) {
			logger.error("\n\tunknown data type :" + clazz + "\n") ;
			throw new RuntimeException("unknown data type :" + clazz);
		}

		return null ;
	}

	public static class IntegerHandler implements TypeHandler {
		public Integer getValue(Object value) {
			return Integer.valueOf(value.toString());
		}
	}

	public static class StringHandler implements TypeHandler {
		public String getValue(Object value) {
			return value.toString();
		}
	}

	public static class LongHandler implements TypeHandler {
		public Long getValue(Object value) {
			return Long.valueOf(value.toString());
		}
	}

	public static class FloatHandler implements TypeHandler {
		public Float getValue(Object value) {
			return Float.valueOf(value.toString());
		}
	}

	public static class DoubleHandler implements TypeHandler {
		public Double getValue(Object value) {
			return Double.valueOf(value.toString());
		}
	}

	public static class BooleanHandler implements TypeHandler {
		public Boolean getValue(Object value) {
			if (value.toString().length() > 1) {
				return Boolean.valueOf(value.toString());
			} else if (value.toString().length() <= 1) {
				char c = value.toString().charAt(0);
				if (c == '1' || c == 'y' || c == 'Y' || c == 't' || c == 'T')
					return Boolean.TRUE;
				else
					return Boolean.FALSE;
			} else {
				return Boolean.FALSE;
			}
		}
	}

	public static class CharacterHandler implements TypeHandler {
		public Character getValue(Object value) {
			return Character.valueOf(value.toString().charAt(0));
		}
	}

	public static class ShortHandler implements TypeHandler {
		public Short getValue(Object value) {
			return Short.valueOf(value.toString());
		}
	}

	public static class ByteHandler implements TypeHandler {
		public Byte getValue(Object value) {
			return Byte.valueOf(value.toString());
		}
	}

	public static class UnsupportedDataHandler implements TypeHandler {
		private Class<?> fieldType;
		public UnsupportedDataHandler(Class<?> fieldType) {
			this.fieldType = fieldType;
		}

		public Object getValue(Object fieldValue) {
			throw new RuntimeException("unknown data type :" + fieldType);
		}
	}
}
分享到:
评论

相关推荐

    C# To JAVA Converter v17.10.6

    C# To Java converter是一款将C#代码片段或者C#项目转换为JAVA的工具。 转换所有版本的C#代码 评估所有引用的程序集和.NET项目,以便更完整地解析外部引用 许多转换和格式化选项 将C#代理和lambdas转换为Java接口...

    Java开发技术大全(500个源代码).

    instanceVar.java 定义一个实例成员变量 invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 ...

    JAVA_API1.6文档(中文)

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    CurrencyConverter:用Java编写的货币转换器

    货币换算用Java编写的货币转换器(转换器并不总是正确的,因为市场每天都在变化)

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    Java 1.6 API 中文 New

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。...

    java开源包11

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包6

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包9

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包4

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包101

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包5

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java技术学习文档.docx

    Java是一种面向对象的编程语言,它支持封装、继承和多态等面向对象的基本概念。Java具有静态类型检查机制,需要在编译时指定变量的类型。Java提供了基本数据类型,如int、double、float等,也支持引用数据类型,如类...

    java开源包8

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包10

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java api最新7.0

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

Global site tag (gtag.js) - Google Analytics