}
public Class<?> generateAccessorClass(Class<?> beanType,
MyClassLoader classLoader, String srcName, String generatedClass)
{
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
String superClass = internalClassName(BeanPropertyAccessor.class.getName());
// muchos important: level at least 1.5 to get generics!!!
cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, generatedClass, null, superClass, null);
cw.visitSource(srcName + ".java", null);
// add default (no-arg) constructor:
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, superClass, "<init>", "()V");
mv.visitInsn(RETURN);
mv.visitMaxs(0, 0); // don't care (real values: 1,1)
mv.visitEnd();
final String beanClass = internalClassName(beanType.getName());
// and then add various accessors; first field accessors:
if (!_intFields.isEmpty()) {
_addIntFields(cw, _intFields, beanClass);
}
if (!_longFields.isEmpty()) {
_addLongFields(cw, _longFields, beanClass);
}
if (!_stringFields.isEmpty()) {
_addStringFields(cw, _stringFields, beanClass);
}
if (!_objectFields.isEmpty()) {
_addObjectFields(cw, _objectFields, beanClass);
}
// and then method accessors:
if (!_intGetters.isEmpty()) {
_addIntGetters(cw, _intGetters, beanClass);
}
if (!_longGetters.isEmpty()) {
_addLongGetters(cw, _longGetters, beanClass);
}
if (!_stringGetters.isEmpty()) {
_addStringGetters(cw, _stringGetters, beanClass);
}
if (!_objectGetters.isEmpty()) {
_addObjectGetters(cw, _objectGetters, beanClass);
}
cw.visitEnd();
byte[] byteCode = cw.toByteArray();
return classLoader.loadAndResolve(srcName, byteCode);
}