gpt4 book ai didi

java - 为什么我的反射加载奇怪的类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:54 24 4
gpt4 key购买 nike

我正在尝试使用反射来查看我是否可以输入类名并且我的应用程序将加载该类并创建它的一个实例。经过几次尝试后,我发现我不能只在 Class.forName() 中粘贴一个没有包名的类名,所以我最终尝试获取已加载的所有可用包的列表并尝试用每个包名称加载我输入的类,直到成功为止。

这是我目前所得到的:

BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String s = "";
do
{
ClassLoader clsldr = ClassLoader.getSystemClassLoader();
Package[] pkgs = Package.getPackages();
s = console.readLine();
if(s.equals(":exit"))
{
System.exit(0);
}
boolean classFound = false;
Object loadedClass = null;
String classname = "";
for (int i = 0; i < pkgs.length; i++) {
Package package1 = pkgs[i];
try
{
classname = package1.getName().replace('/', '.') + "." + s;
clsldr.loadClass(classname);
loadedClass = Class.forName(classname);
classFound = true;
}
catch(Exception e)
{

}

}
System.out.println("LOADED A CLASS!!!!");
System.out.println(classname);
System.out.println(loadedClass);
}
while(s.length() == 0);

它的半工作方式非常奇怪。例如,当我在提示符下键入“Object”时,它以某种方式设法加载了 sun.net.util.Object,但是当我打印出实际对象时,它打印出 class java.lang。对象。我用 String 以及我输入的其他几个东西得到了同样的结果。我尝试过的一个有趣的方法是 int - 它加载了 sun.net.util.int,当我打印对象时它只返回 null。另一个发生在我尝试 Java 时:

Java
LOADED A CLASS!!!!
sun.net.util.Java
null

有人知道这里发生了什么吗? sun.net.util 包是否有什么特别之处导致了这种情况?我真的不在乎我的代码不能完全按照我想要的方式工作,我只是想知道是什么导致了这种奇怪的行为。

Java 版本:

java version "1.7.0_25"                                         
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

如果有任何不同,我使用的是 Windows 8 64 位。

最佳答案

您的代码正在返回“奇怪的”类,因为它所做的在概念上是错误的。任何规范中都没有说明“rt.jar”文件中条目的物理顺序应该是什么。鉴于您进行迭代的方式,它们恰好处于一种导致您找到“怪异”的顺序。在另一个 Java 版本中,您的代码可能会为您提供“非奇怪的”Object 类。无论哪种方式,以这种方式获得“正确”类(class)的假设都是……有缺陷的。


你说你这样做是因为:

"I wanted to take a stab at making a Java interpreter"

好吧,如果你要实现一个解释器,你需要了解 Java 语言。您需要了解的一件事是,在 Java 中可以有许多 具有相同简单名称的类。这意味着您扫描具有给定简单名称的任何类的类路径的想法根本不切实际。你会发现常用类的“冲突”(即具有相同简单名称的类)太多。

在传统的 Java 中,这个冲突问题通过使用完全限定名称引用类或通过导入来解决。为了使您的解释器可用,您需要实现一个反射(reflect)传统 Java 导入机制的导入方案。

简而言之,放弃上面的代码并重新开始。

关于java - 为什么我的反射加载奇怪的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18136929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com