3

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

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

Class<?> c = Class.forName(this.getClass().getName() + "$" + userInput);

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

4

3 回答 3

6

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

public class Foo {
    public static void bar() {
        Runnable runnable = new Runnable() {
            @Override public void run() {}
        };
    }
}

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

于 2013-06-11T16:15:24.103 回答
6

它们是匿名的内部类。

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

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

内部类定义产生额外的类文件。这些类文件的名称结合了内部和外部类名称,例如 MyClass$MyInnerClass.class。

于 2013-06-11T16:15:52.637 回答
1

编译器将美元符号用于内部类。

$符号代表内部类。如果它后面有一个数字,$那么它就是一个匿名内部类。如果它有一个名字,$那么它只是一个内部类。

于 2013-06-11T16:21:15.503 回答