java getDeclaredConstructor().newInstance() 方法
1 getDeclaredConstructor
getDeclaredConstructor()
返回指定参数类型的private
和public
构造器。
对于getDeclaredConstructor
方法获得的构造器需要先设置可访问,再实例化对象。
public class Test {
public Test() {
System.out.println("HelloTest");
}
public static void main(String[] args) throws Exception {
Constructor c = C.class.getDeclaredConstructor(int.class);
c.setAccessible(true);
c.newInstance(5);
}
}
class C {
public C() {}
private C(int i) {System.out.println("HelloC" + i);}
{System.out.println("I'm C class");}
static {System.out.println("static C");}
}
控制台输出
static C
I’m C class
HelloC5
2 newInstance
通过 Class 类的 newInstance()
方法创建对象,该方法要求该 Class 对应类有无参构造方法。执行 newInstance()
方法实际上就是使用对应类的无参构造方法来创建该类的实例,其代码的作用等价于Super sup = new Super()
。
Class c = Class.forName("Super");
//通过Class类的newInstance()方法创建对象
Super sup = (Super)c.newInstance();
System.out.println(sup.supPublic());
如果 Super
类没有无参构造方法,运行程序时则会抛出一个 InstantiationException
实例化异常。
3 clazz.getDeclaredConstructor().newInstance()
clazz.getDeclaredConstructor().newInstance() 方法和 class.newInstance() 方法实例化对象的区别
3.1 区别
- class.newInstance() 会直接调用该类的无参构造函数进行实例化
- getDeclaredConstructor()方法会根据他的参数对该类的构造函数进行搜索并返回对应的构造函数,没有参数就返回该类的无参构造函数,然后再通过newInstance进行实例化。
- class.getDeclaredConstructor().newInstance() 实例化还可以调用静态类和构造参数
3.2 演示
代码
import java.lang.reflect.InvocationTargetException;
public class Test_1 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// 反射通过调用无参构造方法构造对象
TestClass testClass = TestClass.class.getDeclaredConstructor().newInstance();
// 反射通过调用有参构造函数构造对象
TestClass testClas1 = TestClass.class.getDeclaredConstructor(int.class).newInstance(6);
System.out.println("==================== newInstance ====================");
TestClass testClass2 = TestClass.class.newInstance();
System.out.println("通过 newInstance 构造的对象:"+testClass2);
}
}
class TestClass{
public TestClass(){}
public TestClass(int value){
System.out.println(value);
}
static {
System.out.println("静态代码块");
}
}
运行结果
静态代码块
6
==================== newInstance ====================
通过 newInstance 构造的对象:com.huke.TestClass@2f4d3709
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了