`
tianlihu
  • 浏览: 313977 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

java 反射生成对象 工具类

阅读更多
本文版权归作者所有,仅供用来网上学习来用,读者可以收藏,请不要下载到本机和重新发布到其它网站

有觉得可以改进的,请留言,也可加群讨论71326533

工具类代码

import java.lang.reflect.Constructor;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClassUtil {

	public static Logger log = Logger.getLogger(ClassUtil.class.getCanonicalName());

	/**
	 * @param initargs If arguments count more than 1, all arguments can't be null and all arguments types must be references
	 */
	public static <T> T createObject(Class<T> t, String className, Object... initargs) {
		if (initargs == null) {
			return createObject(t, className, null, null);
		}
		Class<?>[] parameterTypes = new Class<?>[initargs.length];
		for (int i = 0; i < initargs.length; i++) {
			parameterTypes[i] = initargs[i].getClass();
		}
		return createObject(t, className, parameterTypes, initargs);
	}

	public static <T> T createObject(Class<T> t, String className, Class<?>[] parameterTypes, Object[] initargs) {
		try {
			Class<?> instanceClass = Class.forName(className);
			if (parameterTypes != null && initargs != null) {
				if (parameterTypes.length == initargs.length) {
					Constructor<?> constructor = instanceClass.getConstructor(parameterTypes);
					return t.cast(constructor.newInstance(initargs));
				} else {
					throw new IllegalArgumentException("Argument arrays lengths are not match");
				}
			} else if (parameterTypes == null && initargs == null) {
				return t.cast(instanceClass.newInstance());
			} else {
				throw new IllegalArgumentException("Argument arrays must be both null or both not null");
			}
		} catch (Exception e) {
			log.log(Level.SEVERE, CommonUtils.exceptionStack2String(e));
		}
		return null;
	}
}


测试类:
public class ClassUtilTest {

	public static void main(String[] args) {
		// 第一个参数为父类或父接口,第二个参数为类名,第三...个参数为构造器的参数,这里保证第三个及以后个参数不能为空。
		// 这里用了范型,不用再强制转换了
		CharSequence cs = ClassUtil.createObject(CharSequence.class, "java.lang.String", "abc");
		System.out.println(cs);
		System.out.println(cs.charAt(0));
	}
}

结果是:
abc
a

不足之处:
对简单类型作为类的构造器的时候,会有异常,例如int。这是由于JDK的自动装包/拆包(Autoboxing/unboxing)造成的。它会把int转化过Integer,然后再去找构造器。这里只有用方法
public static <T> T createObject(Class<T> t, String className, Class<?>[] parameterTypes, Object[] initargs)
强行指定构造器参数类型来调用。int.class和Integer.class是不同的


0
1
分享到:
评论
1 楼 di1984HIT 2013-05-01  
写的很好,我标记一下。

相关推荐

    java反射工具类 ReflectionUtils

    该工具类下载后拷贝到你要用的包,只需该包名即可

    Java反射调用工具类

    这个“Java反射调用工具类”可能是为了简化和封装这些复杂的反射操作而创建的一个实用工具类。 首先,`JobProxy.java`可能是一个代理类,它利用反射来动态地调用目标对象的方法。在Java中,代理模式通常用于在不...

    JAVA SQLite 自动生成实体类 源码

    这个工具可能使用了反射和注解等Java特性,以实现自动化的代码生成。例如,`@Table`和`@Column`注解可以用来标记类和属性对应数据库的表和列。同时,它可能还提供了自定义模板的功能,允许开发者根据自己的需求调整...

    JAVA对象序列化保存为XML文件的工具类

    【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...

    java 反射实体工具类

    StringData JPA 反射生成 自定义显示类集合 !!

    java 代码反射生成工具_generatorConfig

    总结来说,Java 代码反射生成工具_generatorConfig是基于Java反射技术的一个实用开发工具,主要用于自动化生成Java Bean和MyBatis的Mapper XML文件。通过配置文件,它可以有效地根据数据库表结构自动生成代码,减少...

    基于freemarker的JAVA代码生成工具

    **基于Freemarker的JAVA代码生成工具** 在软件开发过程中,尤其是企业级应用,大量重复性的代码编写工作是常见的现象,比如创建与数据库表对应的Java实体类、Service接口及实现、Controller以及MyBatis的Mapper和...

    java代码开发常用工具类

    1.文件类型工具类:FileTypeUtils 2.文件处理工具类:FileUtils ...10.ID生成器工具类:IdUtils 11.反射工具类:ReflectUtils 12.xml转为java对象,java对象转xml文件,主要用于soapUi产生的报文:xml转为java

    利用java反射将json字符串转成对象.zip

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON...

    java各种常用的工具类封装 源码

    `java.lang.reflect` 包提供了`Class`、`Field`、`Method` 等类,`ClassUtil` 或类似的工具类可以封装这些反射操作,如创建对象、调用私有方法、修改私有属性等。 5. **Json**: JSON (JavaScript Object Notation) ...

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作

    Java反射 JavaBean 对象自动生成插入、更新、删除、查询 SQL 语句操作 Java 反射是 Java 语言中一个强大的功能,它允许开发者在运行时检查和修改类、方法、字段的行为。Java 反射机制可以动态地创建对象、调用方法...

    Java反射函数机制实现List转换Json

    总结来说,Java反射机制提供了在运行时检查和操作类的能力,结合JSON序列化库如Jackson,我们可以方便地将List对象转换为JSON格式,以满足数据交换的需求。在实际开发中,了解并掌握这些技术能够帮助我们更好地处理...

    50个左右的JAVA工具类,相对比较全

    7. **反射工具类**:如Java的java.lang.reflect包,或Google的Reflections库,用于运行时检查和操作类、接口、字段和方法。 8. **编码解码工具类**:如Base64编码解码,可以在Java 8的java.util.Base64中找到,或者...

    java 根据简单对象自动 生成excel

    接下来,我们需要一个反射工具类,用于遍历类的所有字段并读取其注解信息: ```java public class ReflectionUtils { public static List&lt;Field&gt; getAnnotatedFields(Class&lt;?&gt; clazz, Class&lt;? extends Annotation&gt;...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...

    Java 反射创建get set方法及反射方法的调用

    在给定的代码示例中,我们看到一个名为`PropertyUtil`的工具类,该类提供了三个主要的方法:`getPropertyDescriptor`、`setProperty` 和 `getProperty`。 1. **getPropertyDescriptor** 方法: - 这个方法的作用是...

    Java常用工具类

    3. **Apache Commons Lang**:Apache软件基金会的一个开源项目,提供了大量扩展Java语言特性的工具类,如字符串处理、数组操作、反射、枚举操作等。 - `StringUtils`:提供了丰富的字符串操作方法,如空白字符处理...

    在spring中获取代理对象代理的目标对象工具类

    通过上述分析,我们可以看到,获取Spring中代理对象的目标对象并非一件简单的事情,它涉及到Spring AOP的底层实现以及Java反射机制的运用。`AopTargetUtils`工具类提供了一种统一的方式,无论是JDK动态代理还是CGLIB...

    java常用工具类

    "java常用工具类"这个主题涵盖了Java开发中常用的类和方法,这些工具类可以帮助我们简化编程工作,提高代码的可读性和可维护性。在Java中,`java.util`包就是这样一个包含大量工具类的包,提供了很多实用的功能。 1...

    JAVA 反射详解PPT

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过反射,我们可以动态地创建对象、访问和修改字段、调用方法,甚至执行私有方法和访问包内可见的元素。...

Global site tag (gtag.js) - Google Analytics