public static <T> byte[] createTargetSetterClass( String className, DelayedCellSetterFactory<T, ?>[] delayedCellSetters, CellSetter<T>[] setters, Type type, boolean ignoreException, int maxMethodSize) throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); FieldVisitor fv; MethodVisitor mv; final String targetType = AsmUtils.toType(type); final String classType = AsmUtils.toType(className); cw.visit( V1_6, ACC_FINAL + ACC_PUBLIC + ACC_SUPER, classType, "L" + CSV_CELL_MAPPER_TYPE + "<L" + targetType + ";>;", CSV_CELL_MAPPER_TYPE, null); // declare fields for (int i = 0; i < delayedCellSetters.length; i++) { if (delayedCellSetters[i] != null) { fv = cw.visitField( ACC_PROTECTED + ACC_FINAL, "delayedCellSetter" + i, AsmUtils.toDeclaredLType(DELAYED_CELL_SETTER_TYPE), "L" + DELAYED_CELL_SETTER_TYPE + "<L" + targetType + ";*>;", null); fv.visitEnd(); } } for (int i = 0; i < setters.length; i++) { if (setters[i] != null) { fv = cw.visitField( ACC_PROTECTED + ACC_FINAL, "setter" + i, AsmUtils.toDeclaredLType(CELL_SETTER_TYPE), "L" + CELL_SETTER_TYPE + "<L" + targetType + ";>;", null); fv.visitEnd(); } } appendInit(delayedCellSetters, setters, cw, targetType, classType, maxMethodSize); appendDelayedCellValue(delayedCellSetters, ignoreException, cw, classType); append_delayedCellValue(delayedCellSetters, cw, classType, maxMethodSize); appendCellValue(setters, ignoreException, cw, classType); append_cellValue(delayedCellSetters, setters, cw, classType, maxMethodSize); appendApplyDelayedSetter(delayedCellSetters, ignoreException, cw, classType, maxMethodSize); appendApplyDelayedCellSetterN(delayedCellSetters, cw, classType); appendGetDelayedCellSetter(delayedCellSetters, cw, targetType, classType, maxMethodSize); appendPeekDelayedCellSetterValue(delayedCellSetters, cw, classType, maxMethodSize); cw.visitEnd(); return AsmUtils.writeClassToFile(className, cw.toByteArray()); }
protected void injectFieldTable(ClassWriter classWriter) { FieldVisitor fieldVisitor = classWriter.visitField( ACC_PRIVATE + ACC_FINAL, "fieldTable", "[Ljava/lang/reflect/Field;", null, null); fieldVisitor.visitEnd(); }