【问题标题】:How do I get the class canonical name by its simple name?如何通过简单名称获取类规范名称?
【发布时间】:2022-01-26 20:44:20
【问题描述】:

假设我有一个带有简单类名的字符串:

String className = "myClassName";

我确定在下面某处有一个具有此名称的类:

"com.automation.qa.company.tests...."

如何获取此类的规范名称? 请帮我找到最好的 Java 解决方案。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 了解如何提高问题的质量。请显示您尝试过的尝试以及您从尝试中得到的问题/错误消息。
  • @Progman 只问了一个问题,“他们如何在一些未知的包集下获得一个类的规范名称?”我不知道你怎么能把它理解为“不专注”

标签: java canonical-name


【解决方案1】:

创建一个方法,将可能的包名添加到指定类名下,然后检查它是否可以使用Class.forName(...) 加载该类。

下面是一个示例,它将搜索当前类加载器可访问的所有包。您可能希望在其中放置一个过滤器,以便仅在可访问包的特定部分下搜索您的类。

public String findClass( String shortName) {
  for (Package pack : Package.getPackages()) {
    try {
      String resolvedName = pack.getName() + "." + className;
      Class class = Class.forName(resolvedName);
      return resolvedName;
    } catch (ClassNotFoundException e) {
      // intentionally blank
    }
  }
  return null;
}

【讨论】:

  • 非常感谢!非常感谢您的帮助!它工作正常。
  • @goraccio 很高兴为您提供帮助。祝你程序的其余部分好运!
  • 大概应该有一个“.”,变量应该是“shortName”吧? String resolvedName = pack.getName() + "." + shortName;
  • 理想情况下,这个方法应该返回一个列表,或者可能是一组字符串。可能有更多的类共享类名。我猜:以后很有可能需要实际的类对象。那么,当您可以收集创建的 Class 对象时,为什么要返回 String 呢?
  • 我不同意可选。关键是,根据定义,可以有多个具有名称的类。只选择找到的第一个,或者选择暗示“有 0 或 1”的 Optinal ......很可能:只是错了。例如,它使您的应用程序非常依赖于类加载器维护的类的顺序。这可能会导致非常讨厌的错误。
猜你喜欢
  • 2015-05-21
  • 2011-09-09
  • 1970-01-01
  • 2023-04-02
  • 2013-10-26
  • 2021-11-28
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多