public FieldOptimizationInfo(Clazz clazz, Field field) {
    int accessFlags = field.getAccessFlags();

    isWritten = isRead = (accessFlags & ClassConstants.INTERNAL_ACC_VOLATILE) != 0;

    if ((accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0) {
      // See if we can initialize the static field with a constant value.
      field.accept(clazz, new AllAttributeVisitor(this));
    }

    if ((accessFlags & ClassConstants.INTERNAL_ACC_FINAL) == 0 && value == null) {
      // Otherwise initialize the non-final field with the default value.
      value = initialValue(field.getDescriptor(clazz));
    }
  }
  public static FieldOptimizationInfo getFieldOptimizationInfo(Field field) {
    Object visitorInfo = field.getVisitorInfo();

    return visitorInfo instanceof FieldOptimizationInfo
        ? (FieldOptimizationInfo) visitorInfo
        : null;
  }
 public static void setFieldOptimizationInfo(Clazz clazz, Field field) {
   field.setVisitorInfo(new FieldOptimizationInfo(clazz, field));
 }