To follow up on Mads email, here is some code from my UI project that displays attributes of the DataValue object that you might find instructive.
private void onSelectNode(OpcUaTreeNode treeNode) throws Exception {
selectedTreeNode = treeNode;
NodeId nodeId = treeNode.getNodeId();
// fill in attributes
ReferenceDescription ref = treeNode.getReferenceDescription();
NodeClass nodeClass = ref.getNodeClass();
NodeId nodeDataType = null;
Class<?> javaType = null;
boolean clazzIsArray = false;
Object value = null;
OffsetDateTime zdt = null;
String valueText = null;
String typeText = null;
if (nodeClass.equals(NodeClass.Variable)) {
DataValue dataValue = getApp().getOpcUaClient().readSynch(nodeId);
Variant variant = dataValue.getValue();
value = variant.getValue();
if (value != null) {
clazzIsArray = value.getClass().isArray();
// data type
Optional<NodeId> dataType = dataValue.getValue().getDataType();
if (dataType.isPresent()) {
nodeDataType = dataType.get();
}
javaType = BuiltinDataType.getBackingClass(nodeDataType);
selectedTreeNode.setNodeDataType(nodeDataType);
// timestamp
zdt = DomainUtils.localTimeFromDateTime(dataValue.getServerTime());
}
}
if (value != null) {
if (!clazzIsArray) {
typeText = javaType.getSimpleName();
if (javaType.equals(DateTime.class)) {
valueText = DomainUtils.utcTimeFromDateTime((DateTime) value).toString();
} else {
valueText = value.toString();
}
} else {
// array or matrix
UInteger[] dims = getApp().getOpcUaClient().getArrayDimensions(nodeId);
// check for matrix
if (dims != null) {
if (dims.length == 1) {
typeText = "Array of " + javaType.getSimpleName() + " with dimension " + arrayToString(dims);
} else {
typeText = "Matrix of " + javaType.getSimpleName() + " with dimensions " + arrayToString(dims);
}
}
StringBuilder sb = new StringBuilder();
arrayToStringRecursive(value, sb);
valueText = sb.toString();
}
}
this.lbNodeId.setText(nodeId.toParseableString());
this.lbNodeDescription.setText(ref.getBrowseName().getName());
this.lbNodeType.setText(typeText);
if (valueText != null) {
this.taNodeValue.setText(valueText);
} else {
this.taNodeValue.clear();
}
if (zdt != null) {
this.lbNodeTimestamp.setText(zdt.toString());
} else {
this.lbNodeTimestamp.setText(null);
}
}