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.Property;
/**
* bean快速访问接口
* @author Administrator
*
* @param <T>
*/
public abstract class BeanAccessor {
/**
* 得到bean的全部属性
* @return 全部属性名
*/
public abstract Collection<String> getPropertyNames();
/**
* 得到bean的某个属性类型
* @param name 属性名
* @return
* @throws NoSuchElementException 如果该属性不存在,抛出NoSuchElementException。
*/
public abstract Class<?> getPropertyType(String name);
/**
* 得到bean的属性的泛型类型
* @param name 属性名
* @return
* @throws NoSuchElementException 如果该属性不存在,抛出NoSuchElementException。
*/
public abstract Type getGenericType(String name);
/**
* 得到bean的属性值
* @param bean
* @param name
* @return
* @throws NoSuchElementException 如果该属性不存在,抛出NoSuchElementException。
*/
public abstract Object getProperty(Object bean,String name);
/**
* 设置bean属性值
* @param bean
* @param name
* @param v
* @return 返回true设置成功,false设置失败(注意此时不会抛出异常)
*/
public abstract boolean setProperty(Object bean,String name,Object v);
/**
* 在两个bean间快速拷贝,从o1拷贝到o2
* @param o1 源对象
* @param o2 目标对象。
*/
public abstract void copy(Object o1,Object o2);
/**
* 得到某个指定ProperyHolder
* @param name
* @return 如果Property不存在,返回null(注意此时不会抛出异常)
*/
public abstract Property getProperty(String name);
/**
* 得到全部属性
* @return
*/
public abstract Collection<? extends Property> getProperties();
/**
* 得到位于field上的annotation
* @param name
* @return 包含各种Annotation的Map
* @throws NoSuchElementException 如果该属性不存在,抛出NoSuchElementException。
*/
public abstract Map<Class<?>,Annotation> getAnnotationOnField(String name);
/**
* 得到位于getter上的annotation
* @param name
* @return 包含各种Annotation的Map
* @throws NoSuchElementException 如果该属性不存在,抛出NoSuchElementException。
*/
public abstract Map<Class<?>,Annotation> getAnnotationOnGetter(String name);
/**
* 得到位于属性setter上的annotation
* @param name
* @return 包含各种Annotation的Map
* @throws NoSuchElementException 如果该属性不存在,抛出NoSuchElementException。
*/
public abstract Map<Class<?>,Annotation> getAnnotationOnSetter(String name);
/**
* 构造一个实例,注意类必须有空构造方法,否则会抛出RuntimeException
* @return 类的实例
* @throws RuntimeException 如果类构造中抛出异常,或者类没有空构造方法
*/
public abstract Object newInstance();
/**
* 使用硬编码的方式快速将对象转换为Map
* @param obj
* @return 转换后的HashMap
*/
public abstract Map<String,Object> convert(Object obj);
/**
* 将Map对象逆向转换回来
* @param map
* @return
*/
public abstract Object fromMap(Map<String, Object> map);
/**
* 将Map逆向转换回来,可以处理不匹配类型的转换(但要消耗更多时间)
* @param map
* @return
*/
public abstract Object fromMap2(Map<String, Object> map);
/**
* 得到Accessor所对应的类本身
* @return
*/
public abstract Class<?> getType();
/*
* 框架内部使用,初始化所有的AnnotationMap
*/
public abstract void initAnnotations(Map<Class<?>,Annotation>[] field,Map<Class<?>,Annotation>[] getter,Map<Class<?>,Annotation>[] setter);
/*
* 框架内部使用,初始化所有的泛型类型
*/
public abstract void initNthGenericType(int index,Class<?> raw,Type type,int total,String fieldName);
/**
* 得到指定Field上的Annotation
* @param field
* @param type
* @return
*/
public <T extends Annotation> T getFieldAnnotation(String field,Class<T> type){
Map<Class<?>,Annotation> anns=getAnnotationOnField(field);
if(anns==null)return null;
return (T)anns.get(type);
}
}