Ich weiß Java lädt Klassen in ersten Zugriff (Erstellen neuer Instanz, statische Methode oder statische Feld aufrufen), aber in diesem einfachen Beispiel versuche ich Führen Sie eine JAR-Datei aus, die einige Klassen verwendet, die zur Laufzeit nicht in meinem ClassPath vorhanden sind. Ich erwarte (wegen der Ladeklassen beim ersten Zugriff) meine Nachrichten in statischen Blöcken und Hauptmethoden auszudrucken, bevor eine Ausnahme aufgetreten ist. aber ich habe "Ausnahme im Thread" main "java.lang.NoClassDefFoundError: com/example/DateAbstract" und nichts gedruckt. Dies trat auf, wenn ich eine abstrakte Klasse oder Schnittstelle in Hauptklasse verwendete, die diese Klassen oder Schnittstellen in einer anderen JAR-Datei sind.NoClassDefFoundError beim Hinzufügen von Klassen zum Klassenpfad zur Laufzeit, wenn ich abstrakte oder Schnittstelle in Hauptklasse
public class Driver {
static { System.out.println("I am first.[static block]"); }
public static void main(String[] args) {
System.out.println("I am first.[ main method]");
DateAbstract date = new CustomDate();
System.out.println(date.sayDate());
}
in meinem anderen Glas:
public class CustomDate extends DateAbstract {
@Override
public String sayDate() {
return new Date().toString();
}
public abstract class DateAbstract {
public abstract String sayDate();
}
wenn ich diesen Code für meine Klassen Classpath zur Laufzeit hinzufügen. Nichts hat sich geändert. Ich habe eine Ausnahme, bevor ich den statischen Block ausführen kann.
public class Driver {
static {
System.out.println("I am first.[static block]");
try {
URL url = new File("lib/DateApi.jar").toURI().toURL();
URLClassLoader urlClassLoader = (URLClassLoader) URLClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(urlClassLoader,url);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println("I am first.[ main method]");
DateAbstract date = new CustomDate();
System.out.println(date.sayDate());
}
}
Fragen: Warum ist das passiert und wie es zu lösen?