我正在编写一个使用Javassist更改java.net.ServerSocket构造函数的代理。我做的非常简单的更改是将调用追加到我的类中调用静态方法的默认构造函数。即使我在调试时看到包含该类的JAR(包含代理的JAR)在类路径中可用,我从java.net.ServerSocket中得到java.lang.NoClassDefFoundError错误..
有人遇到过这样的问题吗?我不知道系统类加载器的限制可能会阻止我的类从java.net中被提供给类。
编辑1:我用于类变换器的相关代码片段:
package my.package;
import java.lang.instrument.ClassFileTransformer;
...
public class QClassFileTransformer implements ClassFileTransformer {
...
public byte[] transform(...) {
...
classPool.insertClassPath(new ByteArrayClassPath(className, classfileBuffer));
classPool.importPackage("my.package");
CtClass ctClass = classPool.get(className.replaceAll("/", "."));
if (!ctClass.isFrozen()) {
for (CtConstructor constructor : ctClass.getDeclaredConstructors()) {
if (constructor.getParameterTypes().length != 0) {
continue;
}
constructor.insertAfter("my.package.QClassFileTransformer.call(this);");
break;
}
byte[] bytecode = ctClass.toBytecode();
ctClass.detach();
return bytecode;
}
...
在转换后的类(java.net.ServerSocket)中,加载类时会抛出my.package.QClassFileTransformer的NoClassDefFoundError异常。