我知道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());
}
}
问题: 为什么会发生这种情况,以及如何解决它?