package jef.accelerator.bean;
import java.lang.reflect.Type;
import java.util.NoSuchElementException;
/**
* 基于ASM实现的属性反射操作。
*
* 目前针对单个属性进行get/set有三种实现:
* ASM-HASH ASM-SWITCH UNSAFE-FieldAccessor
* 目前统计性能如下:(单位ns,测试机i7920,大约比i5 4740延迟多一倍)
*
* Hash get= 49~80 set 68~75
* Switch get 109 set 140~149
* FieldAccessor get 99~101 set 234~253
*
* 从上面可以看出Hash算法下每个Property都是动态类,实质是通过静态代码 非反射直接调用get set方法,速度接近实际get set.
* switch方法由于要做一次基于Hash的Switch,因此要慢。但在分支较少的情况下速度也慢不到哪里去,考虑到字段多的情况,也到不了200ns。
* Unsafe方法实质是反射,无非是跳过了JDK的一些校验,因此比JDK反射要快。但是从实现来看,读的速度挺快接近真实get方法,但是写的速度慢了很多。
* @author Administrator
*
*/
final class FastProperty extends AbstractFastProperty{
private String name;
private BeanAccessor accessor;
FastProperty(BeanAccessor accessor,String name,Type type,Class<?> raw){
this.name=name;
this.accessor=accessor;
this.rawType=raw;
this.genericType=type;
}
public String getName() {
return name;
}
public Object get(Object obj) {
return accessor.getProperty(obj, name);
}
public void set(Object obj, Object value) {
boolean flag=accessor.setProperty(obj, name, value);
if(flag==false){
throw new NoSuchElementException("There's no accessable field "+ name +" in bean.");
}
}
}