gpt4 book ai didi

Java ClassLoader 不缓存类

转载 作者:行者123 更新时间:2023-12-01 12:56:04 29 4
gpt4 key购买 nike

我试图强制使用我的自定义类加载器加载某些类,问题是在加载调用类之后仍然不知道类定义并尝试再次加载它,当然之后我们对该类有两种不同的定义,并将一种定义分配给另一种会导致类转换异常。有什么建议或想法可以解决这个问题吗?

这是调用类:

 CustomClassLoader loader = new CustomClassLoader(this.getPackageCodePath());
Class<?> midletClass = loader.loadClass(className);
midletClass.getMethod("InitEngine", Class.forName("android.app.Activity")).invoke(null, this);
ms_MIDlet = (MIDlet)midletClass.newInstance();//ClassCastException

这是类加载器本身

public class CustomClassLoader extends PathClassLoader
{
public CustomClassLoader(String path)
{
super(path, getSystemClassLoader());//we set the parent to be the system class loader so the loading gets done in this class
}

@Override
public InputStream getResourceAsStream(String resName)
{
//...do some resource loading here
}
}

最佳答案

调用类正在某个类加载器 A 中运行。该类加载器知道在哪里查找和加载MIDlet.class。否则第 4 行会为转换产生 ClassNotFoundException

您还可以使用 CustomClassLoader 的实例来加载 Midlet.class。

在第 4 行,此问题会发生,因为您要将 CustomClassLoader 加载的 Midlet 实例强制转换为 ClassLoader A 加载的 Midlet 实例。

一种解决方案是在加载类本身之前将 CustomClassLoader 逻辑委托(delegate)给 ClassLoader A。类似于首先将对parentLoader.loadClass或getResourceAsStream的loadClass调用委托(delegate)给parentLoader.getResourceAsStream。如果这些调用失败,那么您可以进行自定义资源查找。

这种方法将确保所有 Midlet.class 实际上都是由同一个类加载器加载的。您可以在Java ClassLoader delegation model?查看委托(delegate)示例。

关于Java ClassLoader 不缓存类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23884725/

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