This is what I've been using. For each field, it returns a String like "FieldName:fully.qualified.field.Type".
B4X:
Sub GetMemberNamesAndTypes(o As Object) As String()
Dim jo As JavaObject = Me
Dim fns() As String = jo.RunMethodJO("GetFieldNamesAndTypes",Array(o))
Return fns
End Sub
#If JAVA
import java.lang.reflect.Field;
public static String[] GetFieldNamesAndTypes(Object o)
{
Field[] fields = o.getClass().getFields();
String[] fns = new String[fields.length];
for(int j=0;j<fields.length;j++)
{
fns[j] = fields[j].getName() + ":" + fields[j].getGenericType().getTypeName();
}
return fns;
}
#End If
Used on your Type Data, it would look like this:
B4X:
Dim jo As JavaObject = someData 'this of Type Data
For Each field As String in GetMemberNamesAndTypes(someData)
Dim fieldType As String = Regex.Split(":",field)(1)
Dim fieldName As String = Regex.Split(":",field)(0)
Log($"Name: ${fieldName} Type: ${fieldType} Value: ${jo.GetField(fieldName)}"$)
Next