java类中内部类通过反射实例化的注意事项

本文探讨了Java中通过反射实例化内部类的区别,特别是普通内部类和静态内部类。普通内部类实例化需要指定父类及其实例,而静态内部类则不需要。这种差异源于JVM在编译时的处理。反编译代码显示,普通内部类构造器在编译后带有父类参数,若忽略此参数将导致错误。

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

java的反射功能基本上在任何的代码包中都可以看到,通过反射可以实例化出一个类的对象,那么对于类中的内部类的通过这种方式实例化过程,还是需要注意的,因为不同类型的内部类,实例化的方式是不一样的

本文主要以普通内部类和静态内部类来举例,先上代码:

/**
 * 类名称 Home
 * 说明 TODO
 *
 * @Author xingqing
 * 日期 2021-02-21 16:14
 */
public class Home {

    void have () throws Exception {

        Class<Desk> deskClass = Desk.class;
        // 普通内部类进行实例化,需要指定父类以及父类对象
        Desk desk = deskClass.getDeclaredConstructor(Home.class).newInstance(this);
        desk.legCount();

        Class<Chair> chairClass = Chair.class;
        // 静态内部类不需要指定
        Chair chair = chairClass.getDeclaredConstructor().newInstance();
        chair.chairCount();
    }

    public static void main(String[] args) throws Exception {
        Home home = new Home();
        home.have();
    }
    // 普通内部类
    class Desk {
        Desk () {

        }
        void legCount() {
            System.out.println("4");
        }
    }
    // 静态内部类
    static class Chair {
        Chair() {

        }
        void chairCount() {
            System.out.println("4");
        }
    }


}

解释:

一个普通的Desk内部类和一个静态内部类,在通过反射来实例化的 过程中,是有区别的

通过上面两个截图,其实已经很明确,在对普通的内部类获取构造器时间,一定要加上父类的类类对象以及实力对象;而在对静态内部类时间,无需传递父类参数,这个的原因是JVM虚拟机在编译时不一样的处理而导致的,那么我们反编译class类,上述代码一共会产生三个class类文件,如下图

home的反编译代码我们就不看了,主要看Chair和Desk的反编译代码

import java.io.PrintStream;

class Home$Chair
{
  void chairCount()
  {
    System.out.println("4");
  }
}

import java.io.PrintStream;

class Home$Desk
{
  Home$Desk(Home this$0) {}
  
  void legCount()
  {
    System.out.println("4");
  }
}

那么显而易见了,反编译Desk的编译后的代码后,发现本身无参数的构造函数,有了参数,如果这时间,还是使用无参数的构造器进行实例化时,一定是会报错的!所以大家一定要注意和留心!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值