Java内部类的全限定名规律

本文总结了Java内部类的全限定名规律,包括成员内部类、匿名内部类和局部内部类。成员内部类全限定名为`包名.外部类名$内部类名`,匿名内部类和局部内部类的全限定名会包含外部类名和一个以1开始的正整数,表示在外部类上下文中的顺序。

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

Java内部类的全限定名规律

简述:

        由于最近遇到不少需要反射的类,而其中不乏内部类,在此总结一下内部类的全限定名的规律。

成员内部类

        测试结果表明,无论成员内部类是否为静态,其全限定名都使用如下命名方法:

     包名.外部类名$内部类名
     测试代码:
package com.test;

public class InnerClassTest {
	static class StaticInner{}
	class Inner{}
	public static void main(String[] args) {
		StaticInner si = new StaticInner();
		Inner in = new InnerClassTest().new Inner();
		System.out.println(si.getClass());
		System.out.println(in.getClass());
	}
}

打印结果:

       class com.test.InnerClassTest$StaticInner
       class com.test.InnerClassTest$Inner



匿名内部类

        匿名内部类的全限定名满足如下规律:
包名.外部类名$由1开始的正整数-按照类装载顺序依次排列
      测试代码
package com.test;

public class InnerClassTest {
	static Object staticAnClass = new Object(){};
	static Object staticBlockAnClass;
	static {
		staticBlockAnClass  = new Object(){};
	}
	Object anClass = new Object(){};
	Object blockAnClass;
	{
		blockAnClass = new Object(){};
	}
	public static void main(String[] args) {
		InnerClassTest functionClass = new InnerClassTest(){};
		System.out.println(staticAnClass.getClass());
		System.out.println(staticBlockAnClass.getClass());
		InnerClassTest test = new InnerClassTest();
		System.out.println(test.anClass.getClass());
		System.out.println(test.blockAnClass.getClass());
		System.out.println(functionClass.getClass());
	}
}
打印结果:
      class com.test.InnerClassTest$1
      class com.test.InnerClassTest$2
      class com.test.InnerClassTest$3
      class com.test.InnerClassTest$4
      class com.test.InnerClassTest$5


局部内部类

      局部内部类全限定名使用如下命名方式:

包名.外部类名$由1开始的正整数后跟局部类名-其中数字部分是局部类在外部类上下文出现的先后顺序

    测试代码

package com.test;

public class InnerClassTest {
	public static void main(String[] args) {
		functionA();
		functionB();
	}

	public static void functionA() {
		class Inner {};
		System.out.println(new Inner().getClass());
	}

	public static void functionB() {
		class Inner {};
		System.out.println(new Inner().getClass());
	}

}
      上例打印结果:

      class com.test.InnerClassTest$1Inner
      class com.test.InnerClassTest$2Inner

      在测试代码的基础上在交换main中functionA、B位置后的结果:

      class com.test.InnerClassTest$2Inner
      class com.test.InnerClassTest$1Inner

      在测试代码基础上交换functionA、B声明位置的结果:

      class com.test.InnerClassTest$2Inner
      class com.test.InnerClassTest$1Inner


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值