/ / Java ClassLoader zwischenspeichert nicht die Klasse - Java

Java ClassLoader zwischenspeichert nicht die Klasse - Java

Ich versuche, einige Klassen zu zwingen, zu seinMit meinem benutzerdefinierten Klassenladeprogramm geladen, besteht das Problem nach dem Laden der aufrufenden Klasse noch immer nicht in Kenntnis der Klassendefinition und versucht, sie erneut zu laden. Danach haben wir zwei unterschiedliche Definitionen der Klasse und weisen eine der anderen zu führt zu einer Klassenausnahme. Irgendwelche Hinweise oder Ideen, wie dies behoben werden kann?

Dies ist die aufrufende Klasse:

 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

Und das ist der Klassenlader selbst

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
}
}

Antworten:

1 für die Antwort № 1

Die aufrufende Klasse läuft in einigen ClassLoader A. Dieser Classloader weiß, wo er suchen und laden kann MIDlet.class. Sonst würde Zeile 4 einen erzeugen ClassNotFoundException für die Besetzung

Sie verwenden auch eine Instanz von CustomClassLoader um die Midlet.class zu laden.

In Zeile 4 wird dies in die Luft gesprengt, weil Sie die von geladenen Midlet-Instanzen werfen CustomClassLoader zu einer Midlet-Instanz, die von der geladen wurde ClassLoader A.

Eine Lösung besteht darin, den CustomClassLoader zu erstellenLogikdelegat für ClassLoader A, bevor eine Klasse selbst geladen wird. Etwas im Sinne des ersten Delegierens eines loadClass-Aufrufs an parentLoader.loadClass oder getResourceAsStream an parentLoader.getResourceAsStream Wenn diese Aufrufe fehlschlagen, können Sie Ihre benutzerdefinierte Ressourcensuche durchführen.

Durch diesen Ansatz wird sichergestellt, dass alle Midlet.class-Klassen tatsächlich vom selben Klassenladeprogramm geladen werden Java ClassLoader-Delegierungsmodell?