code: @Override
      public void updateValue() throws DevFailed {
          xlogger.entry(getName());
          // invoke on device
          // final Profiler profilerPeriod = new Profiler("read attribute " + name);
          // profilerPeriod.start("invoke");
          if (!config.getWritable().equals(AttrWriteType.READ) && behavior instanceof ISetValueUpdater) {
              // write value is managed by the user
              try {
                  final AttributeValue setValue = ((ISetValueUpdater) behavior).getSetValue();
                  if (setValue != null) {
                      writeValue = (AttributeValue) ((ISetValueUpdater) behavior).getSetValue().clone();
                      // get as array if necessary (for image)
                      writeValue.setValueWithoutDim(ArrayUtils.from2DArrayToArray(writeValue.getValue()));
                  } else {
                      writeValue = null;
                  }
              } catch (final CloneNotSupportedException e) {
                  throw DevFailedUtils.newDevFailed(e);
              }
          }
          if (config.getWritable().equals(AttrWriteType.WRITE)) {
              if (writeValue == null) {
                  readValue = new AttributeValue();
                  readValue.setValue(AttributeTangoType.getDefaultValue(config.getType()));
              } else {
                  readValue = writeValue;
              }
          } else {
              // attribute with a read part
              final AttributeValue returnedValue = behavior.getValue();
              this.updateValue(returnedValue);
          }
  
          // profilerPeriod.stop().print();
          xlogger.exit(getName());
      }
docs: read attribute on device
  
  @throws DevFailed