gpt4 book ai didi

java - 哪个 java.lang.Class 方法为 Class.forName() 生成正确的输入?

转载 作者:搜寻专家 更新时间:2023-10-30 19:43:02 26 4
gpt4 key购买 nike

我想写一些这样的代码:

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.BarFoo$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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com