【问题标题】:Get the fully-qualified name of a class in Java, Class.forName获取Java类的全限定名,Class.forName
【发布时间】:2022-11-28 10:16:58
【问题描述】:

我想从命令行给出的字符串中识别类类型。例如,args[0] = "Integer"

现在我这样做:

Class<?> cls = Class.forName(args[0]);

但我得到“java.lang.ClassNotFoundException:整数”

我读到我必须在 forName() 中使用类的完全限定名称,所以如何从字符串“Integer”或“java.util.ArrayList”中获取字符串“java.lang.Integer” “来自“ArrayList”等?

【问题讨论】:

  • 好吧,像IntegerArrayList 这样的名字本质上是模棱两可的。它怎么知道你指的是java.lang.Integer而不是some.other.coolpackage.Integer
  • 所以这不可能?如果我想获得包中某个类的完全限定名称怎么办? (假设你不知道路径名)
  • 好吧,我没有那样说。如果你能想到一些规则(这就是我在评论中所问的)将您实际想要查找的类与可能存在的任何其他类区分开来,然后您可以实施这些规则。
  • 收到了。谢谢!
  • “如果我想获得包中某个类的完全限定名称怎么办?”我不确定你的意思。如果您知道它“在您的包中”,那么您就知道它在哪个包中,因此您可以计算 FQN,对吗?你有一个Class对象吗?如果你这样做,就做getName()

标签: java reflection classnotfoundexception classname


【解决方案1】:

在Java中,String、Integer甚至BufferedInputStream都是程序员定义的无意义的词。 Java 的运行方式需要一个完全限定的名称,以便能够将 java.lang.String 与 kotlin.String(一种也在 JVM 上运行的不同语言)等区分开来。

这就是为什么 java.lang.String 不仅是一个名称,而且将 JVM 指向一个包,更重要的是,这个包在文件结构中表示。

这就是为什么在 Java 中使用类名是无效语法的原因,除非该类在同一个包中(在这种情况下,Java 可以使用您当前的包声明找到它)或者如果在顶部有一个导入(这将为 Java 提供一个完整的合格名称参考)

简而言之,除非您有一组规则可以根据短名称​​动态提供完全限定名称,否则您无能为力。

这是一个小脚本的简短演示,它将遍历几个常见的包,告诉您常见的 Java 类在哪里:


public static void getFullyQualifiedClassName(String className) {
        String[] commonPackages = {"java.lang", "java.util", "java.io", "java.math", "java.nio", "java.net"};
        String qualifiedName;
        for (String packageName : commonPackages) {
            try {
                Class.forName(packageName + "." + className).getName();
                System.out.println("A class with that name was found at: " + packageName);
            } catch (ClassNotFoundException e) {
                System.out.println("The class is not in package " + packageName);
            }
        }

给定输入 Integer,将出现以下输出:

A class with that name was found at: java.lang.Integer
The class is not in package java.util
The class is not in package java.io
The class is not in package java.math
The class is not in package java.nio
The class is not in package java.net

这可能没有用,因为您仍然需要提前了解可能的包,但也许它可以为您指明正确的方向

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2014-06-04
    • 2021-11-30
    • 2016-09-30
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多