`
tianlihu
  • 浏览: 311385 次
  • 性别: 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 反射实体工具类

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

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

    在java.beans包中,有两个好东西,XMLEncoder和XMLDecoder。从XML存取对象真是太费力气啦。做了小工具类,以后可以用用了。本文介绍了这两个可以把JAVA对象序列化保存为XML文件的工具类。

    hibernate 配置文件 java类 生成工具

    2. 增加了toJson 方法,可以将对象转换为 json数据格式; 3. 去掉了部分无用代码; 4. 修正了toString 中多余逗号的问题; 5. 去掉了HBM文件中旧的缓存代码; 6. 修正了端口输入方式,直接在IP地址后面增加端口...

    java用list直接生成Excel文件

    利用jxl包结合java反射机制和注释,直接把list生成对应的Excel文件,即只需传入list、对应生成的对象、标题就可以生成excel文件write(String title, List list,Class c),实现一个简单生成excel工具类

    java基础工具类iceroot

    java基础工具类iceroot iceroot是一个java基础工具类.封装了很多有用的方法. 该类库无任何第三方依赖. 涵盖了 字符串操作 时间转化 读取配置文件 等方面. 基础工具类对于java代码的编写是非常必要的,然 而很多...

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

    NULL 博文链接:https://shihuan830619.iteye.com/blog/805948

    Java利用反射导入导出Excle

    利用Java反射机制,导入导出excle文件,生成实体类

    Hibernate的配置文件及代码类生成工具

    修改完配置文件中数据库链接字符串后,直接运行exe文件,可以看到数据库中全部数据表列表,选择需要生成的数据表,再选择生成后文件的存放路径,点击生成按钮即可. --------- 本人转自网络,如有版权限止,请告知.

    javaweb项目常用工具包

    Base64工具类-字符编码工具类-数据类型转换-日期工具类-Escape中文...MD5编码工具类- MD5加密 生成32位md5码-数字工具类-随机数工具类-反射工具类-字符串处理工具类-URL工具类-UUID-常用的数据验证工具类-XML工具类-

    反射+注解自定义ORM

    利用Java反射和注解实现自定义的ORM,并提供相应的工具类自动生成CRUD的SQL语句,同时定义了完整的异常处理机制

    JAVA_API1.6文档(中文)

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    SqlMap自动生成小工具SqlMapAutoGen1.0

    通过java原生的反射机制获取java类的私有字段 1)获取字段名转换成数据库字段名 注意这里有潜规则,默认是这样处理的 createDateTime --&gt; CREATE_DATE_TIME car --&gt; CAR 2)根据字段的java类型获取jdbc类型 我只...

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

    otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法访问本类成员 showMethod.java 演示如何定义一个方法体 showReturn_1.java return...

    根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第12版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    Java 1.6 API 中文 New

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    java api最新7.0

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    JavaAPI1.6中文chm文档 part1

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

Global site tag (gtag.js) - Google Analytics