Member getMember(Class<?> clazz, String property) { ClassCache cache = classCache.get(clazz); if (cache == null) { cache = new ClassCache(clazz); classCache.put(clazz, cache); } Member member = cache.members.get(property); if (member == null) { member = findMember(clazz, property); cache.members.put(property, member); } return member; }
private Member findMember(Class<?> clazz, String property) { final List<Class<?>> classes = getClassHierarchy(clazz); for (Class current : classes) { final Field field; try { field = current.getDeclaredField(property); setAccessibility(field); return field; } catch (NoSuchFieldException e) { final Method method = getMethod(current, property); if (method != null) { setAccessibility(method); return method; } } } // we could not find any match throw new PersistenceException("Unable to find field or method: " + clazz + "#" + property); }
private static Object get(Object proxy, String property, MetadataCache cache) { final Class<?> clazz = proxy.getClass(); try { Member member = cache.getMember(clazz, property); if (member instanceof Field) { return ((Field) member).get(proxy); } else if (member instanceof Method) { return ((Method) member).invoke(proxy); } else { throw new PersistenceException("Member object neither Field nor Method: " + member); } } catch (IllegalAccessException e) { throw new PersistenceException("Unable to access field or method: " + clazz + "#" + property, e); } catch (InvocationTargetException e) { throw new PersistenceException("Unable to access field or method: " + clazz + "#" + property, e); } }
@Before public void setUp() { this.cache = new PersistenceUtilHelper.MetadataCache(); }
/** * Instantiates a new kundera persistence. */ public KunderaPersistence() { this.providerUtil = new KunderaPersistenceProviderUtil(this); this.cache = new PersistenceUtilHelper.MetadataCache(); }