ASM Frameworkを使用して動的にサブクラスを作成しようとしています。 クラスを作成してインスタンス化できました。私はASM動的サブクラスの作成 - NoClassDefFoundError BeanInfo
org.apache.commons.beanutils.BeanUtils.copyProperties(processedEntity, entity);
をしようとするとき、それは、この例外がスローされます。
java.lang.NoClassDefFoundError: com/wheelsup/app/benefits/service/XpOWErhNBiBeanInfo (wrong name: com/wheelsup/app/benefits/service/XpOWErhNBi)
ここで私は、サブクラスを作成するために使用していたコードがあります:
Class<? extends T> get() throws Exception {
String superClassInternalName = getInternalName(superClass);
String subClassSimpleName = RandomStringUtils.random(10, true, false);
String subClassInternalName = getClass().getPackage().getName().replaceAll("\\.", "/").concat("/").concat(subClassSimpleName);
String subClassName = getClass().getPackage().getName().concat(".").concat(subClassSimpleName);
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
classWriter.visit(Opcodes.V1_6,
ACC_PUBLIC,
subClassInternalName,
null,
superClassInternalName,
null);
visitDefaultConstructor(classWriter, superClassInternalName);
classWriter.visitEnd();
return SubClassLoader.<T>init().load(classWriter.toByteArray(), subClassName);
}
private void visitDefaultConstructor(ClassWriter classWriter, String superClassInternalName) {
MethodVisitor methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
methodVisitor.visitCode();
methodVisitor.visitVarInsn(ALOAD, 0);
methodVisitor.visitMethodInsn(INVOKESPECIAL, superClassInternalName, "<init>", "()V");
methodVisitor.visitInsn(RETURN);
methodVisitor.visitMaxs(0, 0);
methodVisitor.visitEnd();
}
private static class SubClassLoader<T> {
private final ClassLoader contextClassLoader;
private SubClassLoader(ClassLoader contextClassLoader) {
this.contextClassLoader = contextClassLoader;
}
static <U> SubClassLoader<U> init() {
return new SubClassLoader<>(Thread.currentThread().getContextClassLoader());
}
@SuppressWarnings("unchecked")
Class<? extends T> load(byte[] classBytes, String className) throws Exception {
return (Class<? extends T>) new SubClassLoader.DynamicClassLoader(contextClassLoader, classBytes).loadClass(className);
}
private static class DynamicClassLoader extends ClassLoader {
private byte[] rawClassBytes;
private DynamicClassLoader(ClassLoader contextClassLoader, byte[] classBytes) {
super(contextClassLoader);
this.rawClassBytes = classBytes;
}
@Override
public Class findClass(String name) {
return defineClass(name, this.rawClassBytes, 0, this.rawClassBytes.length);
}
}
}
私は理解していませんBeanInfo事;それは何ですか?どうすれば問題を解決できますか?
ありがとうございました。
ありがとうHolger! ByteBuddy Frameworkで使用されていたClassLoaderインプラントを見てから、解決策を見つけました。 – arammal