我知道Java在第一個Access中加載類(創建新實例,調用靜態方法或靜態字段),但在這個簡單示例中,我嘗試執行一個jar文件,該文件使用一些在運行時不在我的ClassPath中的類。我期望(因爲在第一次訪問中加載類)在發生異常之前以靜態塊和main方法打印我的消息。但我得到了「線程中的異常」main「java.lang.NoClassDefFoundError:com/example/DateAbstract」,並沒有打印任何內容。 發生這種情況時,我在主類中使用了一個抽象類或接口,該類或接口在另一個jar文件中。NoClassDefFoundError在運行時向類路徑添加類時,我在Main類中使用了抽象或接口
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());
}
在我的另一個罐子:
public class CustomDate extends DateAbstract {
@Override
public String sayDate() {
return new Date().toString();
}
public abstract class DateAbstract {
public abstract String sayDate();
}
當我用我的類在運行時添加到類路徑此代碼
。沒有改變。在執行靜態塊之前我得到了execption。
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());
}
}
問題: 爲什麼會發生這種情況,以及如何解決它?