@SuppressWarnings("rawtypes")
    public static Object getProperty(Object instance, String fieldName) {
        Class clz = instance.getClass();
        Field field = null;
        for ( ; null == field && null != clz; clz = clz.getSuperclass() ) {
            try {
                field = clz.getDeclaredField(fieldName);
            } catch (Exception ignored) {
            }
        }
        final boolean update;
        if ( !field.isAccessible() ) {
            update = true;
            field.setAccessible(true);
        } else {
            update = false;
        }
        try {
            return field.get(instance);
        } catch (Exception ignored) {
            throw new IllegalStateException(ignored);
        } finally {
            if ( update ) {
                field.setAccessible(false);
            }
        }
    }