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

标签 java reflection

我想写一些这样的代码:

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/

相关文章:

java - Kafka Avro 使用模式注册表序列化/反序列化为具体类型失败

java - hadoop - java.lang.RuntimeException : java. lang.InstantiationException 异常

Java反射: Invoke function in a inner static class

Python 自省(introspection) : Automatic wrapping of methods

java - 通过反射获取java注解信息

java - 在登录类的共享首选项中保存字符串以在 MainActivity 中使用 - 无法引用定义的非最终局部变量编辑器

java - 如何在android中对JSONArray进行排序

c# - 实例化所有实现通用接口(interface)实例的类

java - 使用自定义 LoginModule 登录 Jackrabbit

c# - 获取编译器生成的事件委托(delegate)