Java反射无法获取构造函数

本文探讨了Java反射机制中获取构造函数的正确方法,强调了构造函数的访问权限对于反射操作的重要性,并通过示例代码展示了如何解决因构造函数访问权限不当导致的错误。

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

通过反射获取对象的方式有很多,由于之前一直是用

Class clazs = Class.forName(类路径);
Object obj = Class.newInstance();

但是这个方法有很大的弊端,由于Class.newInstance()算是一个无参的构造函数,所以当你的类中没有无参的构造函数时,是无法调用这个方法的。所以今天就尝试了一下通过先获取构造函数的方式来创建对象。

通过查阅JDK文档,我们发现通过反射获取构造函数的方法有很多;

下面是我创建的两个类,注意是有错误的。

class BeInvoke{
    BeInvoke(){

    }
    BeInvoke(int a,int b){

    }
}

public class IIInvoke {
    public static void main(String[] args) throws Exception {
        Class clazs = Class.forName("day26.BeInvoke");
        Object obj1 = clazs.getNestHost();
        Constructor con1 = clazs.getConstructor();//报错的第19行
        Object obj2 = con1.newInstance();
        Constructor con2 = clazs.getConstructor(int.class,int.class);//由于20行还未编译到,暂时不报错
        Object obj3 = con2.newInstance(1,2);
    }
}

当我运行主函数的时候,一直报方法找不到的错误。

问题困扰了我老半天,很奇怪,明明有这个构造方法,而且直接通过类的字节码去调用这个方法对象创建实例对象是可以的,但是用字节码对象去获取构造函数却显示无法获取,查了半天资料,也没找到问题出在哪,后来还是决定从方法入手,再去仔细查看jdk文档的时候,发现这个。

也就是说通过这个方法反射得到的构造函数必须是公共的,也就是要加上public的。哈哈,原来如此,再给类的构造函数加上public修饰词以后,就能通过这个方法的到想要的结果了。

### 使用Java反射获取类的构造方法 #### 获取构造方法的基本概念 在Java中,反射机制允许程序在运行时动态地获取类的各种信息并操作这些信息。对于构造方法而言,可以通过`Class`对象来访问目标类的所有构造函数,无论是公共还是私有的构造函数都可以被获取到[^1]。 #### 实现过程展示 下面是一个具体的例子,展示了怎样使用Java反射技术去取得指定类型的构造方法,并创建该类的新实例: ```java import java.lang.reflect.Constructor; public class ReflectionExample { public static void main(String[] args) throws Exception{ // 获取Student类的Class对象 Class<?> studentClass = Class.forName("com.example.Student"); // 获取特定签名的构造方法, 此处假设有一个接受两个String数的构造器 Constructor<?> constructorWithParams = studentClass.getDeclaredConstructor(String.class, String.class); // 如果是私有构造方法,则设置其可访问性为true if (!constructorWithParams.isAccessible()) { constructorWithParams.setAccessible(true); } // 创建新的Student对象实例 Object newStudentInstance = constructorWithParams.newInstance("李四", "女"); // 打印新建的学生对象信息 System.out.println(newStudentInstance.toString()); } } ``` 这段代码首先通过`forName()`静态方法获得了一个名为`Student`的类对应的`Class`对象。接着调用了`getDeclaredConstructor()`方法指定了想要查的具体构造方法数列表,从而得到了相应的`Constructor`对象。如果这个构造方法不是公开(public),那么还需要调用`setAccessible(true)`使其能够被外部访问。最后一步就是利用得到的构造器对象加上实际传入的数值来构建一个新的`Student`对象实例[^2]。 #### 关键点说明 - `Class<T>` 类提供了许多用于获取构造方法方法,比如`getConstructors()`, `getDeclaredConstructors()`, 和上面提到过的`getDeclaredConstructor(Class<?>...)`等。 - 对于非公有的成员(即默认、受保护或私有的),通常情况下它们不会对外暴露出来供外界直接访问;但是借助于反射中的`accessible`标志位可以绕过这种限制,在某些特殊场景下非常有用[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值