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

时间:2013-06-11 16:13:12

标签: java reflection

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

这将创建一个实现Foo$1

的类Runnable

答案 1 :(得分:6)

他们是匿名内部类。

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

有关详细信息,请参阅this link

  

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

答案 2 :(得分:1)

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

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