在不加载类的情况下逼近class.getSimpleName()的最佳方法是什么?

Uri*_*Uri 7 java reflection

给定一个可以使用Class.forName()加载的完全限定类名,有没有办法将名称转换为加载类并调用getSimpleName()而不实际尝试加载类的结果?我需要这种功能用于反射.

And*_*ner 4

我想说的是,你不能仅仅根据名字来做到这一点。

.您可以尝试在和上进行拆分$,但此示例代码表明简单名称的开始位置并不总是显而易见:

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)

Ideone demo

也就是说,如果你说“最后的名字后面的部分$.”,你就错了。

执行此操作的唯一决定性方法是加载该类,可能无需初始化它:

Class<?> clazz = Class.forName(className, false, someClassLoadeR);
Run Code Online (Sandbox Code Playgroud)