483. Java 反射 - 调用构造器

483. Java 反射 - 调用构造器

文章目录

  • 483. Java 反射 - 调用构造器
    • 1. 定位构造器 (Locating Constructors)
    • 2. 示例:获取 `String` 类的构造器
      • 输出结果(JDK 23 中部分示例):
    • 3. 获取特定构造器
    • 4. 调用构造器创建实例
    • 5. 总结

483. Java 反射 - 调用构造器

在反射中,Constructor类代表某个构造方法。
通过它,我们不仅可以获取构造器的修饰符、参数类型、异常,还可以用它来创建对象实例


1. 定位构造器 (Locating Constructors)

和字段、方法类似,Class提供了 4 种方式来获取构造器:

API 方法返回多个?包含私有构造器?
getConstructor(Class...)❌ 否,只返回public
getDeclaredConstructor(Class...)✅ 是
getConstructors()✅ 是,只返回public
getDeclaredConstructors()✅ 是,包含private

📌 注意:构造器不会被继承,所以只能获取该类本身声明的构造方法。


2. 示例:获取String类的构造器

Class<?>c=String.class;Constructor<?>[]constructors=c.getDeclaredConstructors();System.out.println("# constructors = "+constructors.length);for(Constructor<?>constructor:constructors){System.out.println("constructor = "+constructor);}

输出结果(JDK 23 中部分示例):

# constructors=19constructor=publicjava.lang.String(java.lang.StringBuilder)constructor=privatejava.lang.String(char[],int,int,java.lang.Void)constructor=publicjava.lang.String(byte[],java.lang.String)throwsjava.io.UnsupportedEncodingExceptionconstructor=publicjava.lang.String(char[])constructor=publicjava.lang.String(java.lang.String)constructor=publicjava.lang.String()...

📌说明

  • String类在 JDK 中有 19 个构造器,包括公有私有
  • getDeclaredConstructors()能拿到全部,而getConstructors()只能看到public

3. 获取特定构造器

例如,找到接收字节数组的构造器:

Class<?>c=String.class;Constructor<?>constructor=c.getConstructor(byte[].class);System.out.println("constructor = "+constructor);

输出结果:

constructor=publicjava.lang.String(byte[])

📌关键点

  • byte[].class表示字节数组类型
  • 这和int.classString.class的用法一致

4. 调用构造器创建实例

Constructor.newInstance(Object... initargs)可以用来创建对象。

示例:用字节数组构造String

byte[]data="Hello".getBytes();Constructor<String>constructor=String.class.getConstructor(byte[].class);Stringstr=constructor.newInstance(data);System.out.println(str);

输出:

Hello

📌说明

  • 通过反射构造出的对象和new String(byte[])效果完全一样
  • 如果构造器是私有的,需要调用setAccessible(true)才能使用

5. 总结

  • Constructor类让我们能查看和调用构造器
  • getConstructors()/getDeclaredConstructors()区别 → 是否包含私有构造器
  • newInstance(args...)用于真正创建对象
  • ✅ 如果构造器是私有的 → 需要setAccessible(true)
  • ✅ 构造器不继承,只能访问类自身声明的