大家都知道java中创建一个对象,用new这个关键字,比如,new ArrayList(),new String()等等,java8以后还可以使用实现Supplier函数接口,对象::new来创建对象,还可以使用java反射机制,最近lombok的出现,调用Builder.build()方法来创建对象,创建对象的方式也越来越新颖,今天我们在来介绍一种创建对象的方法,就是使用common-lang3包下的ConstructorUtils类。
ConstructorUtils
该类是调用对象的构造方法,生成实例的工具类,和java反射机制创建对象大同小异,比java反射机制的代码更加简洁,我们就比较下这两种方法。
两者创建对象的比较
两者都是调用对象的无惨或有参构造方法来创建对象。
代码示例
package ConstructorUtilsTest;
import org.apache.commons.lang3.reflect.ConstructorUtils;
public class ConstructorUtilsTest {
public static void main(String[] args) throws Exception {
// java反射机制创建的对象
System.err.println(String.class.getConstructor(String.class).newInstance("iosoft2020"));// ConstructorUtils类创建的对象
System.err.println(ConstructorUtils.invokeConstructor(String.class, "iosoft2020"));}
}
执行结果
iosoft2020
iosoft2020
注意点
ConstructorUtils#invokeConstructor方法,只能调用public的构造函数,否则会抛出异常
代码示例
package ConstructorUtilsTest;
import org.apache.commons.lang3.reflect.ConstructorUtils;
public class ConstructorUtilsExceptionTest {
public static void main(String[] args) throws Exception {
System.err.println(ConstructorUtils.invokeConstructor(Test.class));
}
}
class Test {
private Test() {
}
}
执行结果
Exception in thread "main" java.lang.NoSuchMethodException: No such accessible constructor on object: ConstructorUtilsTest.Test
at org.apache.commons.lang3.reflect.ConstructorUtils.invokeConstructor(ConstructorUtils.java:116)
at org.apache.commons.lang3.reflect.ConstructorUtils.invokeConstructor(ConstructorUtils.java:85)
at ConstructorUtilsTest.ConstructorUtilsExceptionTest.main(ConstructorUtilsExceptionTest.java:9)
我们在写框架或者共通方法时会用到这些方法,下篇我们会讲解下MethodUtils。