我知道 Java 在第一次访问中加载类(创建新实例、调用静态方法或静态字段),但在这个简单的示例中,我尝试执行一个 jar 文件,该文件使用一些在运行时我的 ClassPath 中没有的类。我希望(因为在第一次访问中加载类)在发生异常之前在静态块和 main 方法中打印我的消息。但我得到了“线程“主”java.lang.NoClassDefFoundError:com/example/DateAbstract 中的异常,但没有打印任何内容。当我在主类中使用抽象类或接口时发生这种情况,该类或接口位于另一个 jar 文件中。
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();
}
当我使用此代码在运行时将我的类添加到类路径时。没有改变。在执行静态块之前我得到了执行。
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());
}
}
问题:为什么会发生这种情况以及如何解决?