Reflection Class.forName()查找类<classname> $ 1和<classname> $ 2,它们是什么?

ilo*_*mbo 3 java reflection

我偶然使用反射来解码一些用户字符串条目,在某些情况下可以是简单的整数位(0-9),有时它可以是对另一个类方法的调用.

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

Class<?> c = Class.forName(this.getClass().getName() + "$" + userInput);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 6

那些是匿名的内部类.例如:

public class Foo {
    public static void bar() {
        Runnable runnable = new Runnable() {
            @Override public void run() {}
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

这将创建一个Foo$1实现的类Runnable.


Mar*_*oun 6

他们是匿名的内部阶级.

如果您的.java文件具有内部/嵌套类,则后编译TheClass$xxx.class将由编译器生成为文件.

有关更多信息,请参阅此链接:

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