【问题标题】:How to resolve class name to fully qualified in Java?如何在 Java 中将类名解析为完全限定的?
【发布时间】:2013-07-26 16:09:33
【问题描述】:

Java 中是否有任何方法可以将简单的类名(例如 String)解析为完全限定的类名(例如 java.lang.String),或者直接解析为 Class 更好?我想到的唯一方法是解析文件以进行导入并从类路径 jar 中找出。肯定有更好的办法。

【问题讨论】:

  • 一般情况下无法做到这一点(例如,列表或日期)。是否存在某种限制搜索包的上下文?
  • 你是对的,它依赖于上下文,并且在运行时也可能不可能。我正在编译,所以我有一个上下文。我正在使用 javax.tools.JavaCompiler 编译文件,但仍然不确定这有什么帮助。
  • 如果您可以在源代码中列出导入,您可以尝试从每个包中加载类,但由于您处于编译过程的中间,因此可能找不到该类因为还没有编译...

标签: java classloader


【解决方案1】:

没有办法以一般的方式做到这一点,因为相同的类名可以在多个包中使用,例如“Date”可以是 java.util.Date 或 java.sql.Date。除非你能以某种方式限制搜索区域,否则这在理论上是不可能的。

另外,你一定想知道什么用例会要求你从一个不合格的类名中获取一个类。

【讨论】:

  • 这应该是评论,而不是答案。
  • @Juvanis 好吧,也许我应该将其表述为答案。 “由于逻辑原因,不可能。”
  • (OT) Duuude 这些年你去哪儿了??记得我? (jsalonen)
  • @Joni Hiya 那里!我终于从 sun..err...oracle 论坛搬到这里(它们完全无法使用)。我在这里看到了很多熟悉的名字。太糟糕了,我无法恢复我的声誉;)
【解决方案2】:

Java 编译器通过尝试在类路径上查找具有源文件中的简单类名和导入语句中的包名的不同组合的类来确定完全限定名类名。编译的类 (.class) 总是获得完全限定的名称。

import java.util.Date;

public class Test {
    String str;
    Date date;
...

编译成Test.class

public class Test {
  Ljava/lang/String; str
  Ljava/util/Date; date
  ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多