【反射之构造器(constructor)】

本文详细介绍了如何使用Java反射机制获取.class文件的字节码对象,并通过不同方式获取构造器,最终利用构造器创建实例对象的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

■如何获取到.class文件字节码对象:

  使用Class类的静态方法forName()方法,其参数:类名前(Person)必须加上包名(reflect)

 Class<?> personClass = Class.forName("reflect.Person");

■获取字节码对象的构造器分为两种:

  第一种:获取所有的构造器,只能获取公有的构造器,而不能获取到私有的构造器

Constructor<?>[] constructors = personClass.getConstructors();

  第二种:获取字节码的指定构造器,其参数为:传入构造器的参数类型加上“.class”

Constructor<?> constructor = personClass.getConstructor(String.class, int.class);

■如何使用构造器创建对象:

  使用构造器调用newInstance(),传入相应的参数。

 

Object p = constructor.newInstance("周娟娟", 23);

 

代码:

 1 package reflect_constructor;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.InvocationTargetException;
 5 
 6 import reflect.Person;
 7 
 8 public class ConstructorDemo {
 9 
10     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
11         // 使用Class获取.class文件字节码对象。类名前(Person)必须加上包名(reflect)。
12         Class<?> personClass = Class.forName("reflect.Person");
13         
14         // 获取对象的所有构造器(只能获取到公有的,不能获取到私有构造器)
15         Constructor<?>[] constructors = personClass.getConstructors();
16         for (Constructor<?> constructor : constructors) {
17             System.out.println(constructor);
18         }
19         
20         // 使用字节码对象获取指定构造器
21         Constructor<?> constructor = personClass.getConstructor(String.class, int.class);
22         System.out.println(constructor);
23         
24         // 使用构造器创建实例对象
25         Object p = constructor.newInstance("周娟娟", 23);
26         System.out.println(p);
27     }
28 
29 }

 

 1 package reflect;
 2 
 3 public class Person {
 4     
 5     private String name;
 6     private int age;
 7     
 8     public Person() {
 9     }
10     
11     private Person(int age) {
12         
13     }
14     
15     public Person(String name, int age) {
16         super();
17         this.name = name;
18         this.age = age;
19     }
20 
21     public String getName() {
22         return name;
23     }
24 
25     public void setName(String name) {
26         this.name = name;
27     }
28 
29     public int getAge() {
30         return age;
31     }
32 
33     public void setAge(int age) {
34         this.age = age;
35     }
36 
37     @Override
38     public String toString() {
39         return "Person [name=" + name + ", age=" + age + "]";
40     }
41 
42 }

 

转载于:https://www.cnblogs.com/snow1234/p/7219446.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值