@Override
public void visitEnd() {
if (syntheticClassFields.isEmpty()) {
if (hasClinitMethod) {
MethodVisitor mv = cv.visitMethod(Opcodes.ACC_STATIC
| Opcodes.ACC_SYNTHETIC, "_clinit_", "()V", null, null);
mv.visitCode();
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
} else {
MethodVisitor mv = cv.visitMethod(Opcodes.ACC_STATIC
| Opcodes.ACC_SYNTHETIC, "class$",
"(Ljava/lang/String;)Ljava/lang/Class;", null, null);
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock(l0, l1, l2,
"java/lang/ClassNotFoundException");
mv.visitLabel(l0);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Class",
"forName", "(Ljava/lang/String;)Ljava/lang/Class;", false);
mv.visitLabel(l1);
mv.visitInsn(Opcodes.ARETURN);
mv.visitLabel(l2);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
"java/lang/ClassNotFoundException", "getMessage",
"()Ljava/lang/String;", false);
mv.visitVarInsn(Opcodes.ASTORE, 1);
mv.visitTypeInsn(Opcodes.NEW, "java/lang/NoClassDefFoundError");
mv.visitInsn(Opcodes.DUP);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL,
"java/lang/NoClassDefFoundError", "<init>",
"(Ljava/lang/String;)V", false);
mv.visitInsn(Opcodes.ATHROW);
mv.visitMaxs(3, 2);
mv.visitEnd();
if (hasClinitMethod) {
mv = cv.visitMethod(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE,
"_clinit_", "()V", null, null);
} else {
mv = cv.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V",
null, null);
}
for (String ldcName : syntheticClassFields) {
String fieldName = "class$" + ldcName.replace('/', '$');
mv.visitLdcInsn(ldcName.replace('/', '.'));
mv.visitMethodInsn(Opcodes.INVOKESTATIC, clsName, "class$",
"(Ljava/lang/String;)Ljava/lang/Class;", false);
mv.visitFieldInsn(Opcodes.PUTSTATIC, clsName, fieldName,
"Ljava/lang/Class;");
}
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(1, 0);
mv.visitEnd();
}
super.visitEnd();
}