给定一个可以使用Class.forName()加载的完全限定类名,有没有办法将名称转换为加载类并调用getSimpleName()而不实际尝试加载类的结果?我需要这种功能用于反射.
我想说的是,你不能仅仅根据名字来做到这一点。
.您可以尝试在和上进行拆分$,但此示例代码表明简单名称的开始位置并不总是显而易见:
class Ideone
{
private static class Bar {};
public static void main (String[] args) throws java.lang.Exception
{
class Foo$o {
class Bar$bar {}
};
class Foo$o$Bar {
class Bar$bar {}
};
class Foo$o$Bar$Bar$bar {}
print(Ideone.class);
print(Bar.class);
print(Foo$o.class);
print(Foo$o.Bar$bar.class);
print(Foo$o$Bar.Bar$bar.class);
print(Foo$o$Bar$Bar$bar.class);
}
private static void print(Class<?> clazz) {
System.out.printf("fqn=%s, sn=%s%n", clazz.getName(), clazz.getSimpleName());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
fqn=Ideone, sn=Ideone
fqn=Ideone$Bar, sn=Bar
fqn=Ideone$1Foo$o, sn=Foo$o
fqn=Ideone$1Foo$o$Bar$bar, sn=Bar$bar
fqn=Ideone$1Foo$o$Bar$Bar$bar, sn=Bar$bar
fqn=Ideone$2Foo$o$Bar$Bar$bar, sn=Foo$o$Bar$Bar$bar
Run Code Online (Sandbox Code Playgroud)
也就是说,如果你说“最后的名字后面的部分$或.”,你就错了。
执行此操作的唯一决定性方法是加载该类,可能无需初始化它:
Class<?> clazz = Class.forName(className, false, someClassLoadeR);
Run Code Online (Sandbox Code Playgroud)