打字猴:1.700448391e+09
1700448391
1700448392 Method[]methods=getClass().getMethods();
1700448393
1700448394 for(Method m:methods){
1700448395
1700448396 //判断是否是数据初始化方法
1700448397
1700448398 if(isInitDataMethod(m)){
1700448399
1700448400 m.invoke(this);
1700448401
1700448402 }
1700448403
1700448404 }
1700448405
1700448406 }
1700448407
1700448408 //判断是否是数据初始化方法,基本方法鉴别器
1700448409
1700448410 private boolean isInitDataMethod(Method m){
1700448411
1700448412 return m.getName().startsWith(“init”)//init开始
1700448413
1700448414 &&Modifer.isPublic(m.getModifers())//公开方法
1700448415
1700448416 &&m.getReturnType().equals(Void.TYPE)//返回值是void
1700448417
1700448418 &&!m.isVarArgs()//输入参数为空
1700448419
1700448420 &&!Modifer.isAbstract(m.getModifers());//不能是抽象方法
1700448421
1700448422 }
1700448423
1700448424 }
1700448425
1700448426 在一般的模板方法模式中,抽象模板(这里是AbsPopulator类)需要定义一系列的基本方法,一般都是protected访问级别的,并且是抽象方法,这标志着子类必须实现这些基本方法,这对子类来说既是一个约束也是一个负担。但是使用了反射后,不需要定义任何抽象方法,只需定义一个基本方法鉴别器(例子中isInitDataMethod)即可加载符合规则的基本方法。鉴别器在此处的作用是鉴别子类方法中哪些是基本方法,模板方法(例子中的dataInitialing)则根据基本方法鉴别器返回的结果通过反射执行相应的方法。
1700448427
1700448428 此时,如果需要进行大量的数据初始化工作,子类的实现就非常简单了,代码如下:
1700448429
1700448430 public class UserPopulator extends AbsPopulator{
1700448431
1700448432 public void initUser(){
1700448433
1700448434 /*初始化用户表,如创建、加载数据等*/
1700448435
1700448436 }
1700448437
1700448438 public void initPassword(){
1700448439
1700448440 /*初始化密码*/
[ 上一页 ]  [ :1.700448391e+09 ]  [ 下一页 ]