我想写一些这样的代码:
Object o = ...;
String oTypeName = o.getClass().getName();
//on the other side of the wire:
Class<?> oClass = Class.forName(oTypeName);
Object oAgain = oClass.newInstance();
但是,从 javadoc 中不清楚我应该使用哪种方法来初始化 oTypeName
,即哪种方法将产生预期的输入 Class.forName()
:
-
getCanonicalName()
: "返回由 Java 语言规范定义的底层类的规范名称。如果底层类没有规范名称(即,如果它是本地类或匿名类或其组件类型不具有的数组),则返回 null一个规范的名称)。” -
getName()
: "返回此 Class 对象表示的实体名称(类、接口(interface)、数组类、原始类型或 void),作为字符串。如果此类对象表示的引用类型不是数组类型,则二进制名称按照 Java™ 语言规范的规定返回类的。” -
getTypeName()
: "返回此类型名称的信息字符串。"
很明显,我不想要其中任何一个:
-
getSimpleName()
:“返回源代码中给定的基础类的简单名称。” -
toString()
: "字符串表示是字符串“class”或“interface”,后跟一个空格,然后是类的全限定名,格式为getName返回的格式”
我不希望这适用于原始类型。如果它不适用于数组也没关系。我主要关心的是嵌套类和 Foo.Bar
与 Foo$Bar
。
最佳答案
明确的答案是getName()
.尽管有点隐藏,这在 forName(className, initialize, loader)
的重载的 Javadoc 中指定。 :
Given the fully qualified name for a class or interface (in the same format returned by
getName
) this method attempts to locate, load, and link the class or interface.
并且还指定调用forName(className)
等同于使用默认值调用此重载:
Invoking this method is equivalent to:
Class.forName(className, true, currentLoader)
where currentLoader denotes the defining class loader of the current class.
这是一个示例代码,显示它适用于嵌套类、本地类、匿名类、原始或对象数组。它不适用于基元,因为 Class.forName
不处理基元类。
public class Main {
public static void main(String... args) throws ClassNotFoundException {
class LocalClass {}
System.out.println(Class.forName(name(StaticNestedClass.class))); //static nested class
System.out.println(Class.forName(name(InnerClass.class))); // inner class
System.out.println(Class.forName(name(Integer[].class))); // object array
System.out.println(Class.forName(name(int[].class))); // primitive array
System.out.println(Class.forName(name(List.class))); // interface
System.out.println(Class.forName(name(LocalClass.class))); // local class
System.out.println(Class.forName(name(new Object(){}.getClass()))); // anonymous class
}
private static String name(Class<?> clazz) {
return clazz.getName();
}
public static class StaticNestedClass {}
public class InnerClass {}
}
关于java - 哪个 java.lang.Class 方法为 Class.forName() 生成正确的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667216/