【发布时间】:2012-10-31 04:18:28
【问题描述】:
反射类和方法以及类加载器等需要使用所谓的“二进制”类名称。
问题是,如果只有完全限定名称,即在源代码中使用的名称,如何获得二进制名称。
例如:
package frege;
public static class RT {
....
public static class X { .... }
}
类的完全限定名称是frege.RT.X。然而,要获取类对象,需要编写:
Class.forName("frege.RT$X")
而不是
Class.forName("frege.RT.X") // fails with ClassNotFoundException
因为X 恰好是frege.RT 的内部类。
一种可能但笨拙的解决方案是将. 替换为$ 从后一个接一个,直到Class.forName() 不再抛出ClassNotFoundException 或没有更多. 可替换.
有没有更好/众所周知/标准的解决方案?我查看了 Class、CLassLoader 和 java.lang.reflect 的 API 文档,但没有找到任何可用的内容。
【问题讨论】:
-
我不确定
forName方法是否需要所谓的“二进制名称”。文档说它使用完全限定名称。 -
@EdwinDalorzo 你可以相信我。它找不到具有简单名称的内部类。 (至少 JDK 1.7.0 没有)
-
这很有趣。我现在不在我的电脑里,但我会尽快尝试一下。这很奇怪,因为 JLS 中 Fully Qualified Name 的定义没有包含“二进制名称”的概念。与所有其他类一样,内部类仅用句点 (.) 表示。 Javadocs 说该方法应该接收一个 fqn。所以这个案例很有趣。
-
@EdwinDalorzo 你是对的,API 文档显然在这里被破坏了。它实际上说:
Given the fully qualified name for a class or interface (in the same format returned by getName),它说:If this class object represents a reference type that is not an array type then the binary name of the class is returned, as specified by The Java™ Language Specification. -
好吧,
Class.getName()似乎返回了二进制名称。这是一个相当有趣的问题。我还没有找到将您的规范名称转换为二进制名称的方法。我会喜欢这个,因为我希望最终有人能给出答案。
标签: java reflection jvm