public static int structureSize(Object o, Class baseClass) { return structureSize(o, baseClass, new IdentityHashMap()); } static int structureSize(Object o, Class baseClass, IdentityHashMap seen) { if (o == null || seen.containsKey(o)) return 0; seen.put(o, Boolean.TRUE); int size = 1; Class c = o.getClass(); if (c.isArray()) { int n = Array.getLength(o); for (int i = 0; i < n; i++) size += structureSize(Array.get(o, i), baseClass, seen); } else while (c != Object.class && c != baseClass) { Field[] fields = c.getDeclaredFields(); for (Field field : fields) { if ((field.getModifiers() & Modifier.STATIC) != 0) continue; if (field.getType().isPrimitive()) ++size; else { Object value = null; try { value = field.get(o); } catch (IllegalAccessException e) { throw new RuntimeException(e); } size += structureSize(value, baseClass, seen); } } c = c.getSuperclass(); } return size; }