gpt4 book ai didi

java - 当为加载该类的对象创建引用时?

转载 作者:行者123 更新时间:2023-11-30 05:07:34 25 4
gpt4 key购买 nike

在使用 Java 进行一些示例编码时,我遇到了 ClassCastException,从这里我将对象转换为 StaticClass。谁能解释一下这里发生了什么?

public void test5() throws Exception {

System.out.println(StaticClass.obj);
Object newInstance = ClassLoader.getSystemClassLoader().loadClass("com.StaticClass").newInstance();
System.out.println(newInstance.getClass().getDeclaredField("obj").get(newInstance));

Object newInstance2 = new ILoader().loadClass("com//StaticClass.class").newInstance();
System.out.println(newInstance2.getClass().getDeclaredField("obj").get(newInstance2));

StaticClass s = (StaticClass)newInstance2;
System.out.println(s.obj);

System.out.println(newInstance.getClass().getClassLoader());
System.out.println(newInstance2.getClass().getClassLoader());

}
<小时/>
package com;

public class StaticClass {

public static final Object obj = new Object();
}
<小时/>
package com;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ILoader extends ClassLoader {

public ILoader() {
super(null);
}

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {

File file = new File(name);

byte[] bytes = new byte[(int)file.length()];

try {
new FileInputStream(file).read(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return super.defineClass("com.StaticClass",bytes, 0, bytes.length);
}
}
<小时/>

当代码的转换部分不存在时,最后一个 System.out 给出的输出如下。

sun.misc.Launcher$AppClassLoader@133056f
com.ILoader@1ac3c08

最佳答案

当两个类加载器加载一个类时,您实际上拥有该类的两个副本。在你的场景中,当你做这样的事情

StaticClass s = (StaticClass)newInstance2;

然后,默认情况下,您的默认系统类加载器会进入图片进行转换。由于 newInstance2 是从另一个类加载器加载的,因此它将给出 ClassCastException。这是行不通的——它们由 JVM 内的两个不同的 Class 对象表示,并且转换将会失败。

有关更多详细信息,请参阅以下文章和论坛条目:

  1. http://onjava.com/pub/a/onjava/2003/11/12/classloader.html

  2. http://java.sun.com/developer/technicalArticles/Networking/classloaders/index.html

  3. http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html

  4. http://www.coderanch.com/t/380416/java/java/Loading-same-class-two-different

  5. Different classloaders cause ClassCastException when persisting data via Spring

关于java - 当为加载该类的对象创建引用时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4568047/

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