使用Java反射机制时出现java.lang.InstantiationException:异常

本文深入探讨使用Java反射机制调用方法时出现InstantiationException和NoSuchMethodException异常的原因,提供解决方案,并附带实例代码。

使用Java的反射机制,调用类中的某个方法时,结果出现java.lang.InstantiationException:的异常。完整异常日志如下:

java.lang.InstantiationException: com.tyf.reflect.Student
	at java.lang.Class.newInstance(Class.java:427)
	at com.tyf.reflect.Student.main(Student.java:31)
Caused by: java.lang.NoSuchMethodException: com.tyf.reflect.Student.<init>()
	at java.lang.Class.getConstructor0(Class.java:3082)
	at java.lang.Class.newInstance(Class.java:412)
	... 1 more

下面再贴出我的完整代码:

package com.tyf.reflect;
import java.lang.reflect.Method;
/*
 *@Author:yafeng
 *@Date:2019/10/11
 *@Time:21:24
 * Java反射入门
 */
public class Student {
    String name;
    String gender;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Student(String name, String gender) {
        this.name = name;
        this.gender = gender;
    }

    public static void main(String[] args) {
        try{
            Class c = Student.class;
            Object o = c.newInstance();//初始化一个实例
            Method method_setName = c.getDeclaredMethod("setName", String.class);
            Method method_getName = c.getDeclaredMethod("getName");
            method_setName.invoke(o,"yafneg");
            Object name = method_getName.invoke(o);
            System.out.println(name);
        }catch (Exception e){
            e.printStackTrace();
        }
     }
}

我的代码的意图是通过反射来获取类中的setName()和getName()方法,结果一直报异常,异常位置未31行,即newInstance(),实例化时出现错误。当时还不接为什么这里还会出错?想了想还真是这样,因为你在这里实例化对象就相当于普通的new一个对象,由于我在类中实现了带参数的构造器,覆盖了原有默认的不带参数的构造器,因此不带参数的实例化对象自然会报错。

解决办法有两个:

  • 再手动添加一个不带参的构造器;
  • 在用newInstance()实例化对象时,带参数。

到这里问题得以解决,至于NoSuchMethodException即没该方法异常是由于前者实例化对象时引起的异常的连带异常,解决上述异常后,该异常自然解决。若仅发生了NoSuchMethodException异常,很大可能是因为getDeclaredMethod()的参数有问题,getDeclaredMethod方法的参数:第一个参数为该方法名,后面的参数为原方法中的参数的类类型。

欢迎各位小伙伴补充编程过程中遇到的各种错误以及错误的解决方法,致力于让编程更便利,让错误不再成为烦恼!

YOLOv11人物目标检测数据 目标类别:['Persona'] 中文类别:['人物'] 训练:1683 张 验证:182 张 测试:0 张 总计:1865 张 该数据提供了data.yaml文件,内容如下: train: ../train/images val: ../valid/images test: ../test/images nc: 1 names: ['Persona'] YOLOv11城市街头与室内场景人物目标检测数据 该数据涵盖了城市街头、商业街区、办公场所及室内生活等多种场景中的人物目标检测,具有广泛的应用价值。通过多样的场景设置和丰富的拍摄角度,能够有效提升模型在复杂环境下的目标识别能力,为智慧城市、安防监控及人机交互等领域提供高质量的训练数据支持。 从数据分布来看,该数据包含1683张训练图像、182张验证图像以及0张测试图像,整体比例分配合理。训练与验证的比例约为9.25:1,能够充分满足模型训练与性能评估的需求,确保模型在不同场景下的泛化能力得到充分验证。 该数据的标注工作严谨规范,所有图像均经过人工精确标注,每个目标都配有清晰的边界框和统一的标签“Persona”。标注过程遵循严格的标准,确保了数据的高质量和一致性,为后续的模型训练和性能优化提供了可靠的基础。 基于其多样化的场景覆盖和高质量的标注数据,该数据可广泛应用于智慧城市管理、公共场所安防监控、智能零售分析以及家庭安防等多个领域。特别是在需要精准识别复杂环境中人物的目标检测任务中,该数据能够显著提升模型的准确性和鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值