问题代码
URL[] urls = new URL[6];urls[0] = '/activation-1.1.1.jar'urls[1] = '/animal-sniffer-annotations-1.14.jar'urls[2] = '/annotations-16.0.2.jar'urls[3] = '/antlr-runtime-3.4.jar'urls[4] = '/asm-4.2.jar'urls[5] = '/cglib-3.1.jar'URLClassLoader urlCLassLoader = new URLClassLoader(urls);try{ // 将全部存储到 urlclassload 里面 for (String fullClassName : allFullClassNames) { if (!"module-info".equals(fullClassName)) { Class<?> clazz = urlCLassLoader.loadClass(fullClassName); System.out.println(fullClassName); } }}catch (Exception e){ e.printStackTrace();}
报错前的日志打印
https://paste.ubuntu.org.cn/4545513
net.sf.cglib.transform.AbstractClassTransformer 反编译代码
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//package net.sf.cglib.transform;import org.objectweb.asm.ClassVisitor;public abstract class AbstractClassTransformer extends ClassTransformer { protected AbstractClassTransformer() { super(262144); } public void setTarget(ClassVisitor target) { this.cv = target; }}
AppClassLoader 中没有加载 asm-4.2.jar 与 cglib-3.1.jar 中的类,其他的都有加载过了
上述 jar 包下载地址(无需下载客户端)
https://www.123pan.com/s/dCH9-LYAAA 提取码:v2ex
现在针对以上代码小弟有几个问题:
在Class<?> clazz = urlCLassLoader.loadClass(“net.sf.cglib.transform.AbstractClassTransformer”);小弟进入断点后看到这行执行会报错 java.lang.NoClassDefFoundError: org/apache/tools/ant/Task
这个 NoClassDefFoundError 报错的问题,我在<深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第 3 版)周志明>中找到了原因 大概是 类加载过程解析步骤 出现了 符号引用转为直接引用找不到的问题
但是还是有以下疑问
org/apache/tools/ant/Task 在类 net.sf.cglib.transform.AbstractClassTransformer 中没有看到任何符号引用,不知道为何会找这个类假设:asm-4.2.jar 引用了 cglib-3.1.jar 中的类,那么是不是在加载 asm-4.2.jar 所有类的时候就会报错 NoClassDefFoundError ?