View Javadoc
1   package mockit.asm.fields;
2   
3   import edu.umd.cs.findbugs.annotations.NonNull;
4   import edu.umd.cs.findbugs.annotations.Nullable;
5   
6   import mockit.asm.AnnotatedReader;
7   import mockit.asm.classes.ClassReader;
8   import mockit.asm.classes.ClassVisitor;
9   
10  import org.checkerframework.checker.index.qual.NonNegative;
11  
12  public final class FieldReader extends AnnotatedReader {
13      @NonNull
14      private final ClassVisitor cv;
15      @Nullable
16      private Object constantValue;
17  
18      public FieldReader(@NonNull ClassReader cr, @NonNull ClassVisitor cv) {
19          super(cr);
20          this.cv = cv;
21      }
22  
23      /**
24       * Reads each field and makes the given visitor visit it.
25       *
26       * @return the offset of the first byte following the last field in the class.
27       */
28      @NonNegative
29      public int readFields() {
30          for (int fieldCount = readUnsignedShort(); fieldCount > 0; fieldCount--) {
31              readField();
32          }
33  
34          return codeIndex;
35      }
36  
37      private void readField() {
38          access = readUnsignedShort();
39          String name = readNonnullUTF8();
40          String desc = readNonnullUTF8();
41          constantValue = null;
42  
43          readAttributes();
44  
45          FieldVisitor fv = cv.visitField(access, name, desc, signature, constantValue);
46  
47          if (fv != null) {
48              readAnnotations(fv);
49              fv.visitEnd();
50          }
51      }
52  
53      @Nullable
54      @Override
55      protected Boolean readAttribute(@NonNull String attributeName) {
56          if ("ConstantValue".equals(attributeName)) {
57              int constItemIndex = readUnsignedShort();
58  
59              if (constItemIndex > 0) {
60                  constantValue = readConst(constItemIndex);
61              }
62  
63              return true;
64          }
65  
66          return null;
67      }
68  }