Java 反射类.forName()查找类<;类名>$1及<;类名>$2、它们是什么?

Java 反射类.forName()查找类<;类名>$1及<;类名>$2、它们是什么?,java,reflection,Java,Reflection,碰巧我使用反射来解码一些用户字符串条目,在某些情况下可能是一个简单的整数(0-9),而在其他情况下,它可能是对另一个类方法的调用 检查字符串inputuserInput以查看是否存在具有该名称的类时: Class<?> c = Class.forName(this.getClass().getName() + "$" + userInput); Class c=Class.forName(this.getClass().getName()+“$”+用户输入); 令我惊讶的是,当用

碰巧我使用反射来解码一些用户字符串条目,在某些情况下可能是一个简单的整数(0-9),而在其他情况下,它可能是对另一个类方法的调用

检查字符串input
userInput
以查看是否存在具有该名称的类时:

Class<?> c = Class.forName(this.getClass().getName() + "$" + userInput);
Class c=Class.forName(this.getClass().getName()+“$”+用户输入);
令我惊讶的是,当用户输入“1”或“2”时,forName()确实找到了一个具有该名称的类。这可能是基本Java,所以请原谅我问:这些类是什么?
我使用调试器跟踪代码并检查其他数字,似乎只定义了1和2。

这些是匿名内部类。例如:

public class Foo {
    public static void bar() {
        Runnable runnable = new Runnable() {
            @Override public void run() {}
        };
    }
}
这将创建一个类
Foo$1
,该类实现
Runnable

,它们是匿名内部类

如果
.java
文件具有内部/嵌套类,则编译后编译器会将这些类生成为
类$xxx.class
文件

有关更多信息,请参阅:

内部类定义生成其他类文件。这些类 文件具有组合内部和外部类名的名称,例如 MyClass$MyInnerClass.class


编译器对内部类使用美元符号

$
符号表示内部类。如果它在
$
之后有一个数字,那么它是一个注释性的内部类。如果它在
$
之后有一个名称,那么它只是一个内部类