java 反射生成对象 工具类

[b][color=red][size=medium]本文版权归作者所有,仅供用来网上学习来用,读者可以收藏,请不要下载到本机和重新发布到其它网站[/size][/color][/b]

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

[b]工具类代码[/b]


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;
}
}


[b]测试类:[/b]

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));
}
}

[b]结果是:[/b]
abc
a

[b]不足之处:[/b]
对简单类型作为类的构造器的时候,会有异常,例如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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值