Java类加载器未缓存该类

Java类加载器未缓存该类,java,Java,我试图使用我的自定义类加载器强制加载一些类,问题是加载后调用类仍然不知道类定义,并尝试再次加载,当然,在加载之后,我们有两个不同的类定义,并在类强制转换异常中将一个指定给另一个。 有什么建议或想法可以解决这个问题吗? 这是调用类: CustomClassLoader loader = new CustomClassLoader(this.getPackageCodePath()); Class<?> midletClass = loader.loadClass(className

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

这是调用类:

 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

调用类正在某个类加载器A中运行。这个类加载器知道在哪里查找和加载MIDlet.class。否则,第4行将为强制转换生成ClassNotFoundException

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

在第4行,由于您正在将CustomClassLoader加载的Midlet实例转换为ClassLoader a加载的Midlet实例,因此发生了故障

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


这种方法将确保所有Midlet.class实际上都由同一个类加载器加载。当我将Activity类传递给midget类时,您可以查看位于

的委派示例,即使它们有不同的类装入器,但一切都正常。当我尝试将MIDlet类强制转换为本地MIDlet时,在下一行抛出异常。我现在要做的是将返回的对象保存在一个对象变量中,并确保所有调用都是使用MidleClass实例完成的。您通过反射在ms_MIDlet上执行所有调用,因为您无法强制转换?是的,这不是一个大问题,因为实际上ms_MIDlet在活动中使用得不多,我只是使用活动引导小型执行,然后在发生任何状态更改(暂停、恢复、退出等)时将其转发给它。将来您可能会看到其他问题,这些问题来自不同的类加载器,例如IllegalAccessException。在我的回答中,我将提到一种方法,即如何补救你的情况。
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
    }
}