gpt4 book ai didi

java - 使用不同的加载器在 JVM 中加载一个类两次

转载 作者:搜寻专家 更新时间:2023-10-31 08:23:26 24 4
gpt4 key购买 nike

我有一个关于类加载概念的问题。如何在 JVM 中加载 .class 文件两次。我也正在编写​​我为实现此目的而编写的代码摘录..

1)加载器1代码

public class MyClassLoader extends ClassLoader {

public MyClassLoader(){
super(MyClassLoader.class.getClassLoader());
}

public Class loadClass(String classname){
try {
return super.loadClass(classname);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}

2) Loader 2代码

public class AnotherClassLoader extends ClassLoader {

public AnotherClassLoader(){
super(AnotherClassLoader.class.getClassLoader());
}

public Class loadClass(String classname){
try {
return super.loadClass(classname);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}

3) 现在我正在使用这两个不同的类加载器加载一个名为 A 的类。我想操作 classA1==newClassA 应该返回 false。这是代码:

public static void main(String[] args) {
MyClassLoader loader1 = new MyClassLoader();
AnotherClassLoader newLoader = new AnotherClassLoader();
System.out.println("Load with Custom Class Loader instance");
Class classA1 = loader1.loadClass("com.hitesh.coreJava.A");
System.out.println("Class Loader:::"+classA1.getClassLoader());
Class newClassA = newLoader.loadClass("com.hitesh.coreJava.A");
System.out.println("Class Loader:::"+newClassA.getClassLoader());
System.out.println(classA1==newClassA);
System.out.println(classA1.hashCode() + " , " + newClassA.hashCode());

}

4)以上代码执行结果:

Load with Custom Class Loader instance Class Loader:::sun.misc.Launcher$AppClassLoader@11b86e7 Class Loader:::sun.misc.Launcher$AppClassLoader@11b86e7 true 1641745 , 1641745

你能解释一下吗

最佳答案

试试这个

public class Test1 {

static class TestClassLoader1 extends ClassLoader {

@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (!name.equals("Test1")) {
return super.loadClass(name);
}
try {
InputStream in = ClassLoader.getSystemResourceAsStream("Test1.class");
byte[] a = new byte[10000];
int len = in.read(a);
in.close();
return defineClass(name, a, 0, len);
} catch (IOException e) {
throw new ClassNotFoundException();
}
}
}


public static void main(String[] args) throws Exception {
Class<?> c1 = new TestClassLoader1().loadClass("Test1");
Class<?> c2 = new TestClassLoader1().loadClass("Test1");
System.out.println(c1);
System.out.println(c2);
System.out.println(c1 == c2);
}
}

输出

class Test1
class Test1
false

关于java - 使用不同的加载器在 JVM 中加载一个类两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14257357/

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