打字猴:1.700448461e+09
1700448461 编写高质量代码:改善Java程序的151个建议 [:1700438182]
1700448462 编写高质量代码:改善Java程序的151个建议 建议109:不需要太多关注反射效率
1700448463
1700448464 反射的效率是一个老生常谈的问题,有“经验”的开发人员经常使用这句话恐吓新人:反射的效率是非常低的,不到万不得已就不要使用。事实上,这句话的前半句是对的,后半句是错的。
1700448465
1700448466 反射的效率相对于正常的代码执行确实低很多(经过测试,相差15倍左右),但是它是一个非常有效的运行期工具类,只要代码结构清晰、可读性好那就先开发起来,等到进行性能测试时证明此处性能确实有问题时再修改也不迟(一般情况下反射并不是性能的终极杀手,而代码结构混乱、可读性差则很可能会埋下性能隐患)。我们看这样一个例子:在运行期获得泛型类的泛型类型,代码如下:
1700448467
1700448468 class Utils{
1700448469
1700448470 //获得一个泛型类的实际泛型类型
1700448471
1700448472 public static<T>Class<T>getGenricClassType(Class clz){
1700448473
1700448474 Type type=clz.getGenericSuperclass();
1700448475
1700448476 if(type instanceof ParameterizedType){
1700448477
1700448478 ParameterizedType pt=(ParameterizedType)type;
1700448479
1700448480 Type[]types=pt.getActualTypeArguments();
1700448481
1700448482 if(types.length>0&&types[0]instanceof Class){
1700448483
1700448484 //若有多个泛型参数,依据位置索引返回
1700448485
1700448486 return(Class)types[0];
1700448487
1700448488 }
1700448489
1700448490 }
1700448491
1700448492 return(Class)Object.class;
1700448493
1700448494 }
1700448495
1700448496 }
1700448497
1700448498 前面我们讲过,Java的泛型类型只存在于编译期,那为什么这个工具类可以取得运行期的泛型类型呢?那是因为该工具只支持继承的泛型类,如果是在Java编译时已经确定了泛型类的类型参数,那当然可以通过泛型获得了。例如有这样一个泛型类:
1700448499
1700448500 abstract class BaseDao<T>{
1700448501
1700448502 //获得T的运行期类型
1700448503
1700448504 private Class<T>clz=Utils.getGenricClassType(getClass());
1700448505
1700448506 //根据主键获得一条记录
1700448507
1700448508 public void get(long id){
1700448509
1700448510 session.get(clz, id);
[ 上一页 ]  [ :1.700448461e+09 ]  [ 下一页 ]