package com.jarvis.cache.aop.asm;
import java.io.IOException;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
public class SecureAccountGenerator {
private static AccountGeneratorClassLoader classLoader=new AccountGeneratorClassLoader();
private static Class<?> secureAccountClass;
public static Account generateSecureAccount() throws ClassFormatError, InstantiationException, IllegalAccessException, IOException {
if(null == secureAccountClass) {
String className=Account.class.getName();
ClassReader cr=new ClassReader(className);
ClassWriter cw=new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassVisitor classAdapter=new AddSecurityCheckClassAdapter(cw);
cr.accept(classAdapter, ClassReader.SKIP_DEBUG);
byte[] data=cw.toByteArray();
secureAccountClass=classLoader.defineClassFromClassFile(className + "$EnhancedByASM", data);
}
return (Account)secureAccountClass.newInstance();
}
private static class AccountGeneratorClassLoader extends ClassLoader {
public Class<?> defineClassFromClassFile(String className, byte[] classFile) throws ClassFormatError {
return defineClass(className, classFile, 0, classFile.length);
}
}
}