src/org/nutz/repo/org/objectweb/asm/ClassReader.java
private int readField(final ClassVisitor classVisitor,
            final Context context, int u) {
        // reads the field declaration
        char[] c = context.buffer;
        int access = readUnsignedShort(u);
        String name = readUTF8(u + 2, c);
        String desc = readUTF8(u + 4, c);
        u += 6;

        // reads the field attributes
        String signature = null;
        int anns = 0;
        int ianns = 0;
        int tanns = 0;
        int itanns = 0;
        Object value = null;
        Attribute attributes = null;

        for (int i = readUnsignedShort(u); i > 0; --i) {
            String attrName = readUTF8(u + 2, c);
            // tests are sorted in decreasing frequency order
            // (based on frequencies observed on typical classes)
            if ("ConstantValue".equals(attrName)) {
                int item = readUnsignedShort(u + 8);
                value = item == 0 ? null : readConst(item, c);
            } else if (SIGNATURES && "Signature".equals(attrName)) {
                signature = readUTF8(u + 8, c);
            } else if ("Deprecated".equals(attrName)) {
                access |= Opcodes.ACC_DEPRECATED;
            } else if ("Synthetic".equals(attrName)) {
                access |= Opcodes.ACC_SYNTHETIC
                        | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
            } else if (ANNOTATIONS
                    && "RuntimeVisibleAnnotations".equals(attrName)) {
                anns = u + 8;
            } else if (ANNOTATIONS
                    && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
                tanns = u + 8;
            } else if (ANNOTATIONS
                    && "RuntimeInvisibleAnnotations".equals(attrName)) {
                ianns = u + 8;
            } else if (ANNOTATIONS
                    && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
                itanns = u + 8;
            } else {
                Attribute attr = readAttribute(context.attrs, attrName, u + 8,
                        readInt(u + 4), c, -1, null);
                if (attr != null) {
                    attr.next = attributes;
                    attributes = attr;
                }
            }
            u += 6 + readInt(u + 4);
        }
        u += 2;

        // visits the field declaration
        FieldVisitor fv = classVisitor.visitField(access, name, desc,
                signature, value);
        if (fv == null) {
            return u;
        }

        // visits the field annotations and type annotations
        if (ANNOTATIONS && anns != 0) {
            for (int i = readUnsignedShort(anns), v = anns + 2; i > 0; --i) {
                v = readAnnotationValues(v + 2, c, true,
                        fv.visitAnnotation(readUTF8(v, c), true));
            }
        }
        if (ANNOTATIONS && ianns != 0) {
            for (int i = readUnsignedShort(ianns), v = ianns + 2; i > 0; --i) {
                v = readAnnotationValues(v + 2, c, true,
                        fv.visitAnnotation(readUTF8(v, c), false));
            }
        }
        if (ANNOTATIONS && tanns != 0) {
            for (int i = readUnsignedShort(tanns), v = tanns + 2; i > 0; --i) {
                v = readAnnotationTarget(context, v);
                v = readAnnotationValues(v + 2, c, true,
                        fv.visitTypeAnnotation(context.typeRef,
                                context.typePath, readUTF8(v, c), true));
            }
        }
        if (ANNOTATIONS && itanns != 0) {
            for (int i = readUnsignedShort(itanns), v = itanns + 2; i > 0; --i) {
                v = readAnnotationTarget(context, v);
                v = readAnnotationValues(v + 2, c, true,
                        fv.visitTypeAnnotation(context.typeRef,
                                context.typePath, readUTF8(v, c), false));
            }
        }

        // visits the field attributes
        while (attributes != null) {
            Attribute attr = attributes.next;
            attributes.next = null;
            fv.visitAttribute(attributes);
            attributes = attr;
        }

        // visits the end of the field
        fv.visitEnd();

        return u;
    }
private int readField(final ClassVisitor classVisitor,
            final Context context, int u) {
        // reads the field declaration
        char[] c = context.buffer;
        int access = readUnsignedShort(u);
        String name = readUTF8(u + 2, c);
        String desc = readUTF8(u + 4, c);
        u += 6;

        // reads the field attributes
        String signature = null;
        int anns = 0;
        int ianns = 0;
        int tanns = 0;
        int itanns = 0;
        Object value = null;
        Attribute attributes = null;

        for (int i = readUnsignedShort(u); i > 0; --i) {
            String attrName = readUTF8(u + 2, c);
            // tests are sorted in decreasing frequency order
            // (based on frequencies observed on typical classes)
            if ("ConstantValue".equals(attrName)) {
                int item = readUnsignedShort(u + 8);
                value = item == 0 ? null : readConst(item, c);
            } else if (SIGNATURES && "Signature".equals(attrName)) {
                signature = readUTF8(u + 8, c);
            } else if ("Deprecated".equals(attrName)) {
                access |= Opcodes.ACC_DEPRECATED;
            } else if ("Synthetic".equals(attrName)) {
                access |= Opcodes.ACC_SYNTHETIC
                        | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
            } else if (ANNOTATIONS
                    && "RuntimeVisibleAnnotations".equals(attrName)) {
                anns = u + 8;
            } else if (ANNOTATIONS
                    && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
                tanns = u + 8;
            } else if (ANNOTATIONS
                    && "RuntimeInvisibleAnnotations".equals(attrName)) {
                ianns = u + 8;
            } else if (ANNOTATIONS
                    && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
                itanns = u + 8;
            } else {
                Attribute attr = readAttribute(context.attrs, attrName, u + 8,
                        readInt(u + 4), c, -1, null);
                if (attr != null) {
                    attr.next = attributes;
                    attributes = attr;
                }
            }
            u += 6 + readInt(u + 4);
        }
        u += 2;

        // visits the field declaration
        FieldVisitor fv = classVisitor.visitField(access, name, desc,
                signature, value);
        if (fv == null) {
            return u;
        }

        // visits the field annotations and type annotations
        if (ANNOTATIONS && anns != 0) {
            for (int i = readUnsignedShort(anns), v = anns + 2; i > 0; --i) {
                v = readAnnotationValues(v + 2, c, true,
                        fv.visitAnnotation(readUTF8(v, c), true));
            }
        }
        if (ANNOTATIONS && ianns != 0) {
            for (int i = readUnsignedShort(ianns), v = ianns + 2; i > 0; --i) {
                v = readAnnotationValues(v + 2, c, true,
                        fv.visitAnnotation(readUTF8(v, c), false));
            }
        }
        if (ANNOTATIONS && tanns != 0) {
            for (int i = readUnsignedShort(tanns), v = tanns + 2; i > 0; --i) {
                v = readAnnotationTarget(context, v);
                v = readAnnotationValues(v + 2, c, true,
                        fv.visitTypeAnnotation(context.typeRef,
                                context.typePath, readUTF8(v, c), true));
            }
        }
        if (ANNOTATIONS && itanns != 0) {
            for (int i = readUnsignedShort(itanns), v = itanns + 2; i > 0; --i) {
                v = readAnnotationTarget(context, v);
                v = readAnnotationValues(v + 2, c, true,
                        fv.visitTypeAnnotation(context.typeRef,
                                context.typePath, readUTF8(v, c), false));
            }
        }

        // visits the field attributes
        while (attributes != null) {
            Attribute attr = attributes.next;
            attributes.next = null;
            fv.visitAttribute(attributes);
            attributes = attr;
        }

        // visits the end of the field
        fv.visitEnd();

        return u;
    }
private int readField ( final ClassVisitor classVisitor , final Context context , int u ) { // reads the field declaration char [ ] c = context . buffer ; int access = readUnsignedShort ( u ) ; String name = readUTF8 ( u + 2 , c ) ; String desc = readUTF8 ( u + 4 , c ) ; u += 6 ; // reads the field attributes String signature = null ; int anns = 0 ; int ianns = 0 ; int tanns = 0 ; int itanns = 0 ; Object value = null ; Attribute attributes = null ; for ( int i = readUnsignedShort ( u ) ; i > 0 ; -- i ) { String attrName = readUTF8 ( u + 2 , c ) ; // tests are sorted in decreasing frequency order // (based on frequencies observed on typical classes) if ( "ConstantValue" . equals ( attrName ) ) { int item = readUnsignedShort ( u + 8 ) ; value = item == 0 ? null : readConst ( item , c ) ; } else if ( SIGNATURES && "Signature" . equals ( attrName ) ) { signature = readUTF8 ( u + 8 , c ) ; } else if ( "Deprecated" . equals ( attrName ) ) { access |= Opcodes . ACC_DEPRECATED ; } else if ( "Synthetic" . equals ( attrName ) ) { access |= Opcodes . ACC_SYNTHETIC | ClassWriter . ACC_SYNTHETIC_ATTRIBUTE ; } else if ( ANNOTATIONS && "RuntimeVisibleAnnotations" . equals ( attrName ) ) { anns = u + 8 ; } else if ( ANNOTATIONS && "RuntimeVisibleTypeAnnotations" . equals ( attrName ) ) { tanns = u + 8 ; } else if ( ANNOTATIONS && "RuntimeInvisibleAnnotations" . equals ( attrName ) ) { ianns = u + 8 ; } else if ( ANNOTATIONS && "RuntimeInvisibleTypeAnnotations" . equals ( attrName ) ) { itanns = u + 8 ; } else { Attribute attr = readAttribute ( context . attrs , attrName , u + 8 , readInt ( u + 4 ) , c , - 1 , null ) ; if ( attr != null ) { attr . next = attributes ; attributes = attr ; } } u += 6 + readInt ( u + 4 ) ; } u += 2 ; // visits the field declaration FieldVisitor fv = classVisitor . visitField ( access , name , desc , signature , value ) ; if ( fv == null ) { return u ; } // visits the field annotations and type annotations if ( ANNOTATIONS && anns != 0 ) { for ( int i = readUnsignedShort ( anns ) , v = anns + 2 ; i > 0 ; -- i ) { v = readAnnotationValues ( v + 2 , c , true , fv . visitAnnotation ( readUTF8 ( v , c ) , true ) ) ; } } if ( ANNOTATIONS && ianns != 0 ) { for ( int i = readUnsignedShort ( ianns ) , v = ianns + 2 ; i > 0 ; -- i ) { v = readAnnotationValues ( v + 2 , c , true , fv . visitAnnotation ( readUTF8 ( v , c ) , false ) ) ; } } if ( ANNOTATIONS && tanns != 0 ) { for ( int i = readUnsignedShort ( tanns ) , v = tanns + 2 ; i > 0 ; -- i ) { v = readAnnotationTarget ( context , v ) ; v = readAnnotationValues ( v + 2 , c , true , fv . visitTypeAnnotation ( context . typeRef , context . typePath , readUTF8 ( v , c ) , true ) ) ; } } if ( ANNOTATIONS && itanns != 0 ) { for ( int i = readUnsignedShort ( itanns ) , v = itanns + 2 ; i > 0 ; -- i ) { v = readAnnotationTarget ( context , v ) ; v = readAnnotationValues ( v + 2 , c , true , fv . visitTypeAnnotation ( context . typeRef , context . typePath , readUTF8 ( v , c ) , false ) ) ; } } // visits the field attributes while ( attributes != null ) { Attribute attr = attributes . next ; attributes . next = null ; fv . visitAttribute ( attributes ) ; attributes = attr ; } // visits the end of the field fv . visitEnd ( ) ; return u ; }
Reads a field and makes the given visitor visit it.

@param classVisitor
the visitor that must visit the field.
@param context
information about the class being parsed.
@param u
the start offset of the field in the class file.
@return the offset of the first byte following the field in the class.
Reads a field and makes the given visitor visit it .