我偶然使用反射来解码一些用户字符串条目,在某些情况下可以是一个简单的整数位(0-9),有时可以调用另一个类方法。
检查字符串输入userInput
以查看是否存在具有该名称的类:
Class<?> c = Class.forName(this.getClass().getName() + "$" + userInput);
令我惊讶的是,当用户输入“1”或“2”时Class.forName()
确实找到了一个具有该名称的类。这可能是基本的Java,所以请原谅我:这些类是什么?
我使用调试器跟踪代码并检查其他数字,似乎只定义了1和2。
答案 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)
美元符号由编译器用于内部类。
$
符号表示内部类。如果它在$
之后有一个数字,那么它就是一个匿名的内部类。如果它在$
之后有一个名称,那么它只是一个内部类。