`

Java Reflection

    博客分类:
  • Java
阅读更多
/**
	 * Parse an object to another object with the same name
	 * 
	 * @param org ->
	 *            Original Object
	 * @param tar ->
	 *            Target Object Class
	 * @return
	 */
	public static Object transformSameClass(Object org, Class tarClz) {
		if (org == null)
			return null;
		Object tar = null;
		try {
			tar = tarClz.newInstance();

			// Class tarClz = tar.getClass();
			Class orgClz = org.getClass();
			Method[] tarMethods = tarClz.getMethods();
			Method[] orgMethods = orgClz.getMethods();
			LinkedList orgMethodsList = new LinkedList();
			for (int i = 0; i < orgMethods.length; i++) {
				String tmpMethodName = orgMethods[i].getName();
				if (tmpMethodName.startsWith("get") && !tmpMethodName.startsWith("getClass")) {
					orgMethodsList.add(orgMethods[i]);
				}
			}

			Class[] parameterTypes = new Class[1];
			Object[] arguments = new Object[1];

			for (int i = 0; i < tarMethods.length; i++) {
				String tarMethod = tarMethods[i].getName();
				if (tarMethod.startsWith("get") && !tarMethod.startsWith("getClass")) {
					for (int j = 0; j < orgMethodsList.size(); j++) {
						Method orgMethod = (Method) orgMethodsList.get(j);
						String orgMethodStr = orgMethod.getName();
						if (tarMethod.equalsIgnoreCase(orgMethodStr)) {
							orgMethodsList.remove(j); // remove from list, optimize next loop

							Object field = orgMethod.invoke(org, null);
							if (field != null) {
								if (tarMethods[i].getReturnType().equals(orgMethod.getReturnType())) {
									parameterTypes[0] = orgMethod.getReturnType();
									arguments[0] = field;
									// keep the same class type
								} else if (tarMethods[i].getReturnType().equals(Long.class) && orgMethod.getReturnType().equals(Integer.class)) {
									// parse integer to long
									parameterTypes[0] = Long.class;
									arguments[0] = new Long(Integer.parseInt(field.toString()));
								} else if (tarMethods[i].getReturnType().equals(Integer.class) && orgMethod.getReturnType().equals(Long.class)) {
									// parse long to Integer
									parameterTypes[0] = Integer.class;
									arguments[0] = new Integer(Integer.parseInt(field.toString()));
								} else if (tarMethods[i].getReturnType().equals(boolean.class) && orgMethod.getReturnType().equals(Boolean.class)) {
									// parse boolean
									parameterTypes[0] = boolean.class;
									arguments[0] = field;
								} else if (tarMethods[i].getReturnType().equals(Boolean.class) && orgMethod.getReturnType().equals(boolean.class)) {
									// parse Boolean
									parameterTypes[0] = Boolean.class;
									arguments[0] = field;
								} else {
									break;
								}
								Method med = tarClz.getMethod(StringUtil.replaceStringWithSet(tarMethod), parameterTypes);
								med.invoke(tar, arguments);
							}
							break;

						}

					}
				}

			}
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
		return tar;
	}

 

/**
	 * Long fields (Number) passed from flex is null, but changed to '0' in Java. This method is to parse that fields
	 * back to Null
	 * 
	 * @param obj
	 *            Object that contains Long Type field
	 * @return Object
	 */
	public static Object paser0FieldsToNull(Object obj) {
		if (obj == null)
			return null;
		Class clz = obj.getClass();
		Object retObj = obj;
		Method[] methods = clz.getMethods();

		Class[] parameterTypes = new Class[1];

		for (int i = 0; i < methods.length; i++) {
			Class retType = methods[i].getReturnType();
			if (retType.equals(Long.class) || retType.equals(Integer.class)) {
				parameterTypes[0] = retType;
				String name = methods[i].getName();
				Object field;
				try {
					field = methods[i].invoke(obj, null);
					if (field != null && !name.equals("getVersion")) { // version=0 is correct
						Long val = new Long(field.toString());
						if (val.equals(new Long(0))||val.equals(new Integer(0))) {
							if (log.isDebugEnabled())
								log.debug("==> This field value is 0, and will parse to Null: " + name);
							// Method med = clz.getMethod(name.replace("get", "set"), parameterTypes);
							Method med = clz.getMethod(StringUtil.replaceStringWithSet(name), parameterTypes);
							Object[] arguments = new Object[1];
							arguments[0] = null;
							med.invoke(retObj, arguments);
						}
					}
				} catch (Exception e) {
					log.error(e.getMessage());
					if (log.isDebugEnabled()) {
						e.printStackTrace();
					}
				}
			}
		}
		return retObj;
	}

 

分享到:
评论

相关推荐

    java reflection in action

    在《Java Reflection in Action》这本书中,作者深入探讨了这一主题,帮助开发者理解并有效地利用Java反射机制。这本书是2005年出版的英文版,对于想要提升Java编程技能,特别是对动态类型和元编程感兴趣的开发者来...

    Java Reflection in Action

    Java Reflection in Action这本书作为Java反射机制的经典之作,详细介绍了反射技术的应用和相关的概念基础,是Java开发者的必备书籍。 首先,反射允许开发者在不知道对象具体类型的情况下,通过类名获取类类型,...

    Java Reflection In Action

    本书《Java Reflection in Action》深入浅出地讲解了Java反射技术的各种应用场景和技术细节。书中通过一系列生动的例子展示了如何安全有效地使用反射技术解决实际问题。例如: 1. **使用反射进行动态代理**:介绍了...

    Java Reflection in Action_PDF+sample source

    《Java Reflection in Action》这本书深入探讨了这一主题,为开发者提供了理解和运用反射的强大工具。这本书包含了PDF版的全文以及示例源代码,帮助读者通过实践来学习。 1. **反射基础**: - 反射API:`java.lang...

    Java Reflection In Action(英文版)

    《Java Reflection In Action》这本书深入探讨了这个主题,对于理解和掌握Java动态性有着极大的帮助。以下是关于Java反射的一些关键知识点: 1. **反射基础**:反射API主要包括`java.lang.Class`、`java.lang....

    基于Java Reflection自动逆向生成类间方法关系图的解析器.pdf

    Java Reflection是Java提供的用于在运行时获取类、接口、方法、字段等信息的机制。在本论文中,作者利用反射机制开发了一个能够自动逆向分析Java源代码或编译后的.class文件的解析器。反射在动态语言编程中有着广泛...

    Manning Java Reflection In Action

    Java Reflection in Action Java Reflection in Action is unique in presenting a clear account of all the cool things you can do with reflection, and at the same time providing the sound conceptual basis...

    Java Reflection (JAVA反射)详解

    Java 反射(Reflection)是Java编程语言的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、方法、字段等)并直接操作对象的内部属性。这为开发者提供了强大的灵活性,能够在不预先知道具体类的情况下...

    JAVA REFLECTION IN ACTION

    《JAVA反射在行动》这本书由Ira R. Forman和Nate Forman撰写,由MANNING出版社出版,是一本深入探讨Java反射机制及其应用的权威指南。反射是Java语言的一项强大特性,允许运行时检查类的信息并操作类的对象,这在很...

    Java Reflection (JAVA反射)

    ### Java反射机制详解 #### 一、Java反射机制概述 反射是Java编程语言的一个关键特性,它赋予了Java程序在运行时自我检查的能力,并能够直接操纵程序内部的属性。通过反射,开发者可以在运行时获取类的信息(如...

    基于Java Reflection的数据库访问通用模型设计与实现.pdf

    "基于Java Reflection的数据库访问通用模型设计与实现" 本文提出了基于Java Reflection机制和面向接口的编程思想,设计并实现了一款Java数据库访问通用模型,该模型具有适用范围广、轻量级、可扩展性好等特点,可以...

    Manning - Java Reflection in Action

    《Java Reflection in Action》一书由Ira R. Forman和Nate Forman共同撰写,旨在帮助读者深入理解Java反射机制的核心概念和技术细节,并通过一系列实用案例展示如何有效地利用反射技术来解决实际问题。 #### 二、...

    Java反射经典实例 Java Reflection Cookbook[1].pdf

    ### Java反射经典实例详解 #### 一、引言 反射是Java编程语言中的一个重要特性,它允许程序在运行时检查自身结构(如类、字段、方法等),并且可以在运行时调用任意一个类的成员(包括私有成员)。这一特性为Java...

    Java Reflection (JAVA反射.mht

    Java Reflection (JAVA反射.mht

Global site tag (gtag.js) - Google Analytics