package jef.accelerator.bean; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.Collection; import java.util.Map; import java.util.NoSuchElementException; import jef.tools.reflect.BeanAccessorMapImpl; import jef.tools.reflect.BeanWrapper; import jef.tools.reflect.Property; /** * 快速Bean访问器实现 * @author jiyi * */ public final class FastBeanWrapperImpl extends BeanWrapper{ private static final BeanAccessorFactory bf=new ASMAccessorFactory(); private Object obj; private BeanAccessor accessor; public static final BeanAccessor getAccessorFor(Class<?> clz){ if(Map.class.isAssignableFrom(clz))return BeanAccessorMapImpl.INSTANCE; return bf.getBeanAccessor(clz); } public FastBeanWrapperImpl(Object obj) { super(obj); this.accessor=bf.getBeanAccessor(obj.getClass()); this.obj=obj; } public FastBeanWrapperImpl(Object obj,BeanAccessor ba) { super(obj); this.accessor=ba; this.obj=obj; } @Override public boolean isProperty(String fieldName) { return accessor.getPropertyNames().contains(fieldName); } @Override public boolean isReadableProperty(String fieldName) { return accessor.getPropertyNames().contains(fieldName); } @Override public boolean isWritableProperty(String fieldName) { return accessor.getPropertyNames().contains(fieldName); } @Override public Type getPropertyType(String fieldName) { return accessor.getGenericType(fieldName); } @Override public Class<?> getPropertyRawType(String fieldName) { return accessor.getPropertyType(fieldName); } @Override public Object getWrapped() { return obj; } @Override public String getClassName() { return obj.getClass().getName(); } @Override public Object getPropertyValue(String name) { return accessor.getProperty(obj, name); } @Override public void setPropertyValue(String fieldName, Object newValue) { boolean flag=accessor.setProperty(obj, fieldName, newValue); if(!flag){ throw new NoSuchElementException("There's no accessable field '"+ fieldName +"' in class "+getClassName()); } } @Override public Collection<String> getPropertyNames() { return accessor.getPropertyNames(); } @Override public Collection<String> getRwPropertyNames() { return accessor.getPropertyNames(); } @Override public Property getProperty(String name) { return accessor.getProperty(name); } @SuppressWarnings({ "unchecked"}) @Override public <T extends Annotation> T getAnnotationOnField(String name, Class<T> clz) { Map<Class<?>,Annotation> map=accessor.getAnnotationOnField(name); return map==null?null:(T)map.get(clz); } @SuppressWarnings({ "unchecked"}) @Override public <T extends Annotation> T getAnnotationOnGetter(String name, Class<T> clz) { Map<Class<?>,Annotation> map=accessor.getAnnotationOnGetter(name); return map==null?null:(T)map.get(clz); } @SuppressWarnings({ "unchecked" }) @Override public <T extends Annotation> T getAnnotationOnSetter(String name, Class<T> clz) { Map<Class<?>,Annotation> map=accessor.getAnnotationOnSetter(name); return map==null?null:(T)map.get(clz); } @Override public Collection<? extends Property> getProperties() { return accessor.getProperties(); } }