code: @Override
      public AttributeValue_4[] read_attributes_4(final String[] names, final DevSource source, final ClntIdent clIdent)
              throws DevFailed {
          // final Profiler profilerPeriod = new Profiler("period");
          // profilerPeriod.start(Arrays.toString(names));
          MDC.setContextMap(contextMap);
          xlogger.entry(Arrays.toString(names));
          if (names.length != 1 || !names[0].equalsIgnoreCase(DeviceImpl.STATE_NAME)
                  && !names[0].equalsIgnoreCase(DeviceImpl.STATUS_NAME)) {
              checkInitialization();
          }
  
          deviceMonitoring.startRequest("read_attributes_4 " + Arrays.toString(names), source, clIdent);
          clientIdentity.set(clIdent);
          if (names.length == 0) {
              throw DevFailedUtils.newDevFailed(READ_ERROR, READ_ASKED_FOR_0_ATTRIBUTES);
          }
          if (!name.equalsIgnoreCase(getAdminDeviceName())) {
              clientLocking.checkClientLocking(clIdent, names);
          }
  
          AttributeValue_4[] result = null;
          try {
              result = AttributeGetterSetter.getAttributesValues4(name, names, pollingManager, attributeList,
                      aroundInvokeImpl, source, deviceLock, clIdent);
          } catch (final Exception e) {
              deviceMonitoring.addError();
              if (e instanceof DevFailed) {
                  throw (DevFailed) e;
              } else {
                  // with CORBA, the stack trace is not visible by the client if
                  // not inserted in DevFailed.
                  throw DevFailedUtils.newDevFailed(e);
              }
          }
          xlogger.exit();
          // profilerPeriod.stop().print();
          return result;
      }
docs: Read some attributes. IDL 4 version.
  
  @param names   The attributes names
  @param source  the device source (CACHE, DEV or CACHE_DEV)
  @param clIdent the client ID
  @return The read results.
  @throws DevFailed