Java方法内定义的本地枚举(enum)的全限定类名如何获取?
方法内定义的本地枚举的正确全限定类名是什么?
从Java 16开始,我们可以在方法内部定义本地枚举、接口(该特性随JEP 395的records特性一同推出)。这类方法内的本地枚举,全限定类名格式和成员内部类不同,你之前尝试的几种写法都不对,正确格式是外部类全名+$N$本地枚举名,其中$N里的N是数字序号。
对应你的代码
demo方法里的Shape枚举,正确全限定类名是work.basil.example.enums.EnumMagic$1Shape。
快速验证方法
直接在代码里打印Shape.class.getName()就能拿到准确类名,比如在demo方法里加一行:
System.out.println(Shape.class.getName());
运行后就能看到编译器生成的实际类名。
为什么之前的写法失效?
方法内的本地类(包括枚举、接口)和类的成员内部类逻辑不同:
- 成员内部类的类名是
外部类$内部类,比如若Shape是EnumMagic的成员枚举,类名是work.basil.example.enums.EnumMagic$Shape - 但方法内的本地类会在外部类和本地类名之间插入序号($1、$2...),这是为了区分同一方法内的多个本地类,或者不同方法里的同名本地类,保证类名唯一性。
重要提醒
硬编码带序号的类名很不可靠——如果后续你在demo方法里、Shape之前新增其他本地类(比如另一个枚举或普通类),序号会变成$2,导致之前的字符串查找直接失效。除非有特殊需求,否则建议直接通过Shape.class获取类对象,而非用Class.forName配合字符串。
修改后的可运行示例代码:
package work.basil.example.enums; public class EnumMagic { public static void main ( String[] args ) { EnumMagic app = new EnumMagic ( ); app.demo ( ); } private void demo ( ) { enum Shape { CIRCLE, SQUARE } // 打印正确的全限定类名 System.out.println("Shape的全限定类名:" + Shape.class.getName()); try { // 使用正确的类名字符串 Class<?> clazz = Class.forName("work.basil.example.enums.EnumMagic$1Shape"); System.out.println("clazz = " + clazz); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }
内容的提问来源于stack exchange,提问作者Basil Bourque
相关产品推荐
相关产品推荐

