public static ElConstantField of(ReflectField field) { if(!field.isFinal()){ return null; } Class<?> cls = field.getDeclaringClass(); String name = field.getName(); synchronized (lock) { Map<String, ElConstantField> cache = constants.get(cls); if(null == cache){ cache = new WeakHashMap<String, ElConstantField>(); constants.put(cls, cache); } ElConstantField f = cache.get(name); if(null == f){ f = new ElConstantField(field); cache.put(name, f); } return f; } }
private ElConstantField(ReflectField field) { Args.assertTrue(field.isStatic() && field.isFinal(),"Must be static final field"); this.value = field.getValue(null); }
public void setValue(Object instance, Object value, boolean useSetter) { try { if(field.isSynthetic() || isFinal()){ field.set(instance, safeValue(value)); }else{ if(useSetter && null != setter){ if(setterAccessorIndex != -1){ accessor.invokeMethod(instance, setterAccessorIndex, safeValue(value)); }else{ setter.invoke(instance, safeValue(value)); } }else{ if(fieldAccessorIndex != -1){ accessor.setFieldValue(instance, fieldAccessorIndex, safeValue(value)); }else{ field.set(instance, safeValue(value)); } } } } catch (Exception e) { throw new ReflectException(Strings.format("Error setting value '{0}' to field '{1}'",value,getName()),e); } }
prop.setWritable(field.isPublicSet() || (field.isPublic() && !field.isFinal())); prop.setTransient(field.isTransient()); prop.setAnnotations(field.getReflectedField().getAnnotations());
@Override public ElProperty resolveProperty(Class<?> cls, String name) { ReflectClass rc = ReflectClass.of(cls); ReflectField rf = rc.getField(name); if(null != rf && rf.isPublicGet()){ if(rf.isStatic()){ return rf.isFinal() ? ElConstantField.of(rf) : new ElStaticField(rf); }else{ return new ElInstanceField(rf); } } final ElMethod m = resolveMethod(cls, name, Arrays2.EMPTY_OBJECT_ARRAY); if(null != m) { return new ElProperty() { @Override public Object getValue(ElEvalContext context, Object instance) throws Throwable { return m.invoke(context, instance, Arrays2.EMPTY_OBJECT_ARRAY); } }; } return null; }