获取Java中类的全限定名class . forname



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

现在我这样做:

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

但是我得到"java.lang。ClassNotFoundException: Integer"

我已经读到,我必须在forName()中使用类的全限定名称,那么我如何才能获得字符串"java.lang.Integer"从字符串"integer"或"java.util. arraylist"中获取。from "ArrayList"等等?

在Java中,String, Integer甚至BufferedInputStream都是程序员定义的无意义的单词。按照Java的运行方式,它需要一个完全限定的名称,以便能够区分Java .lang. string和kotlin等。字符串(也在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

这可能没有用,因为您仍然需要提前知道可能的包,但它可能会为您指明正确的方向

最新更新