483. Java 反射 - 调用构造器

📅 2026/8/3 17:07:53
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...)否❌ 否只返回publicgetDeclaredConstructor(Class...)否✅ 是getConstructors()✅ 是只返回publicgetDeclaredConstructors()✅ 是包含private 注意构造器不会被继承所以只能获取该类本身声明的构造方法。2. 示例获取String类的构造器Class?cString.class;Constructor?[]constructorsc.getDeclaredConstructors();System.out.println(# constructors constructors.length);for(Constructor?constructor:constructors){System.out.println(constructor constructor);}输出结果JDK 23 中部分示例# constructors19constructorpublicjava.lang.String(java.lang.StringBuilder)constructorprivatejava.lang.String(char[],int,int,java.lang.Void)constructorpublicjava.lang.String(byte[],java.lang.String)throwsjava.io.UnsupportedEncodingExceptionconstructorpublicjava.lang.String(char[])constructorpublicjava.lang.String(java.lang.String)constructorpublicjava.lang.String()...说明String类在 JDK 中有 19 个构造器包括公有和私有getDeclaredConstructors()能拿到全部而getConstructors()只能看到public3. 获取特定构造器例如找到接收字节数组的构造器Class?cString.class;Constructor?constructorc.getConstructor(byte[].class);System.out.println(constructor constructor);输出结果constructorpublicjava.lang.String(byte[])关键点byte[].class表示字节数组类型这和int.class、String.class的用法一致4. 调用构造器创建实例Constructor.newInstance(Object... initargs)可以用来创建对象。示例用字节数组构造Stringbyte[]dataHello.getBytes();ConstructorStringconstructorString.class.getConstructor(byte[].class);Stringstrconstructor.newInstance(data);System.out.println(str);输出Hello说明通过反射构造出的对象和new String(byte[])效果完全一样如果构造器是私有的需要调用setAccessible(true)才能使用5. 总结✅Constructor类让我们能查看和调用构造器✅getConstructors()/getDeclaredConstructors()区别 → 是否包含私有构造器✅newInstance(args...)用于真正创建对象✅ 如果构造器是私有的 → 需要setAccessible(true)✅ 构造器不继承只能访问类自身声明的