@Override public void internalize(Object... obj) { walker.walk(obj); }
nullSafeAdd(toVisit, object); if (traversalDebugMessage != null && object != null) { traversalDebugMessage.append(object.getClass().getName()) if (!byPassIfFlyweight(ref) && shouldWalkClass(refClass)) { if (refClass.isArray() && !refClass.getComponentType().isPrimitive()) { for (int i = 0; i < Array.getLength(ref); i++) { Object referred = Array.get(ref, i); if (nullSafeAdd(toVisit, referred)) { Class<?> component = refClass.getComponentType(); for (Field field : getFilteredFields(refClass)) { try { Object referred = field.get(ref); if (nullSafeAdd(toVisit, referred)) { Map<Object, Object> internalized = FIELD_TO_REFERENCES.computeIfAbsent(field, f -> new ConcurrentHashMap<>());
/** * Returns the filtered fields for a particular type * * @param refClass * the type * @return A collection of fields to be visited */ private Collection<Field> getFilteredFields(Class<?> refClass) { SoftReference<Collection<Field>> ref = fieldCache.get(refClass); Collection<Field> fieldList = ref != null ? ref.get() : null; if (fieldList != null) { return fieldList; } else { Collection<Field> result; result = sizeOfFilter.filterFields(refClass, getAllFields(refClass)); if (USE_VERBOSE_DEBUG_LOGGING && LOGGER.isDebugEnabled()) { for (Field field : result) { if (Modifier.isTransient(field.getModifiers())) { LOGGER.debug("SizeOf engine walking transient field '{}' of class {}", field.getName(), refClass.getName()); } } } fieldCache.put(refClass, new SoftReference<>(result)); return result; } }
public PepperReferenceInternalizer(SizeOfFilter fieldFilter, boolean bypassFlyweight, Set<Class<?>> classesToInternalize) { TypeFilter filter = new TypeFilter(); classesToInternalize.forEach(c -> filter.addClass(c, false)); this.walker = new PepperObjectGraphWalker(new CombinationSizeOfFilter(filter, fieldFilter), bypassFlyweight); }