@Override public FieldAccessor build(ClassLoader classLoader) { String targetClassType = getInternalName(this.getTarget().getName()); ClassWriter classWriter = this.getClassWriter(); injectFieldTable(classWriter); injectConstructor(classWriter); injectGetTargetClass(classWriter, this.getTarget()); List<Field> fields = new ArrayList<>(); Class<?> current = this.getTarget(); while (current != Object.class) { for (Field field : current.getDeclaredFields()) { fields.add(field); } current = current.getSuperclass(); } injectGetByIndex(classWriter, targetClassType, fields); injectSetByIndex(classWriter, targetClassType, fields); injectGetByName(classWriter); injectSetByName(classWriter); injectGetFieldTable(classWriter); injectGetIndex(classWriter); classWriter.visitEnd(); Class<?> result = CompilerService.create(classLoader) .defineClass( getExternalName( getAccessorNameInternal( this.getTarget(), this .getAccessorType())), // this is somewhat redundant but maybe in the // future the class-name-format changes this.getClassWriter().toByteArray()); return (FieldAccessor) instantiate(result); }