Search in sources :

Example 1 with Property

use of org.springframework.core.convert.Property in project spring-framework by spring-projects.

the class ReflectivePropertyAccessor method canWrite.

@Override
public boolean canWrite(EvaluationContext context, Object target, String name) throws AccessException {
    if (target == null) {
        return false;
    }
    Class<?> type = (target instanceof Class ? (Class<?>) target : target.getClass());
    PropertyCacheKey cacheKey = new PropertyCacheKey(type, name, target instanceof Class);
    if (this.writerCache.containsKey(cacheKey)) {
        return true;
    }
    Method method = findSetterForProperty(name, type, target);
    if (method != null) {
        // Treat it like a property
        Property property = new Property(type, null, method);
        TypeDescriptor typeDescriptor = new TypeDescriptor(property);
        this.writerCache.put(cacheKey, method);
        this.typeDescriptorCache.put(cacheKey, typeDescriptor);
        return true;
    } else {
        Field field = findField(name, type, target);
        if (field != null) {
            this.writerCache.put(cacheKey, field);
            this.typeDescriptorCache.put(cacheKey, new TypeDescriptor(field));
            return true;
        }
    }
    return false;
}
Also used : Field(java.lang.reflect.Field) TypeDescriptor(org.springframework.core.convert.TypeDescriptor) Method(java.lang.reflect.Method) Property(org.springframework.core.convert.Property)

Example 2 with Property

use of org.springframework.core.convert.Property in project spring-framework by spring-projects.

the class ReflectivePropertyAccessor method canRead.

@Override
public boolean canRead(EvaluationContext context, Object target, String name) throws AccessException {
    if (target == null) {
        return false;
    }
    Class<?> type = (target instanceof Class ? (Class<?>) target : target.getClass());
    if (type.isArray() && name.equals("length")) {
        return true;
    }
    PropertyCacheKey cacheKey = new PropertyCacheKey(type, name, target instanceof Class);
    if (this.readerCache.containsKey(cacheKey)) {
        return true;
    }
    Method method = findGetterForProperty(name, type, target);
    if (method != null) {
        // Treat it like a property...
        // The readerCache will only contain gettable properties (let's not worry about setters for now).
        Property property = new Property(type, method, null);
        TypeDescriptor typeDescriptor = new TypeDescriptor(property);
        this.readerCache.put(cacheKey, new InvokerPair(method, typeDescriptor));
        this.typeDescriptorCache.put(cacheKey, typeDescriptor);
        return true;
    } else {
        Field field = findField(name, type, target);
        if (field != null) {
            TypeDescriptor typeDescriptor = new TypeDescriptor(field);
            this.readerCache.put(cacheKey, new InvokerPair(field, typeDescriptor));
            this.typeDescriptorCache.put(cacheKey, typeDescriptor);
            return true;
        }
    }
    return false;
}
Also used : Field(java.lang.reflect.Field) TypeDescriptor(org.springframework.core.convert.TypeDescriptor) Method(java.lang.reflect.Method) Property(org.springframework.core.convert.Property)

Example 3 with Property

use of org.springframework.core.convert.Property in project spring-framework by spring-projects.

the class ReflectivePropertyAccessor method read.

@Override
public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException {
    if (target == null) {
        throw new AccessException("Cannot read property of null target");
    }
    Class<?> type = (target instanceof Class ? (Class<?>) target : target.getClass());
    if (type.isArray() && name.equals("length")) {
        if (target instanceof Class) {
            throw new AccessException("Cannot access length on array class itself");
        }
        return new TypedValue(Array.getLength(target));
    }
    PropertyCacheKey cacheKey = new PropertyCacheKey(type, name, target instanceof Class);
    InvokerPair invoker = this.readerCache.get(cacheKey);
    lastReadInvokerPair = invoker;
    if (invoker == null || invoker.member instanceof Method) {
        Method method = (Method) (invoker != null ? invoker.member : null);
        if (method == null) {
            method = findGetterForProperty(name, type, target);
            if (method != null) {
                // TODO remove the duplication here between canRead and read
                // Treat it like a property...
                // The readerCache will only contain gettable properties (let's not worry about setters for now).
                Property property = new Property(type, method, null);
                TypeDescriptor typeDescriptor = new TypeDescriptor(property);
                invoker = new InvokerPair(method, typeDescriptor);
                lastReadInvokerPair = invoker;
                this.readerCache.put(cacheKey, invoker);
            }
        }
        if (method != null) {
            try {
                ReflectionUtils.makeAccessible(method);
                Object value = method.invoke(target);
                return new TypedValue(value, invoker.typeDescriptor.narrow(value));
            } catch (Exception ex) {
                throw new AccessException("Unable to access property '" + name + "' through getter method", ex);
            }
        }
    }
    if (invoker == null || invoker.member instanceof Field) {
        Field field = (Field) (invoker == null ? null : invoker.member);
        if (field == null) {
            field = findField(name, type, target);
            if (field != null) {
                invoker = new InvokerPair(field, new TypeDescriptor(field));
                lastReadInvokerPair = invoker;
                this.readerCache.put(cacheKey, invoker);
            }
        }
        if (field != null) {
            try {
                ReflectionUtils.makeAccessible(field);
                Object value = field.get(target);
                return new TypedValue(value, invoker.typeDescriptor.narrow(value));
            } catch (Exception ex) {
                throw new AccessException("Unable to access field '" + name + "'", ex);
            }
        }
    }
    throw new AccessException("Neither getter method nor field found for property '" + name + "'");
}
Also used : Field(java.lang.reflect.Field) AccessException(org.springframework.expression.AccessException) TypeDescriptor(org.springframework.core.convert.TypeDescriptor) Method(java.lang.reflect.Method) Property(org.springframework.core.convert.Property) EvaluationException(org.springframework.expression.EvaluationException) AccessException(org.springframework.expression.AccessException) TypedValue(org.springframework.expression.TypedValue)

Aggregations

Field (java.lang.reflect.Field)3 Method (java.lang.reflect.Method)3 Property (org.springframework.core.convert.Property)3 TypeDescriptor (org.springframework.core.convert.TypeDescriptor)3 AccessException (org.springframework.expression.AccessException)1 EvaluationException (org.springframework.expression.EvaluationException)1 TypedValue (org.springframework.expression.TypedValue)1