上一篇中,我们模拟了一个需要委托事件的场景,并且用了一个中间接口实现这个委托模式,今天我们来看看,不用接口需要怎么实现。
大家都知道反射机制吧,这个机制的初衷就是让一个类可以直接访问到另外一个类的各种属性和方法甚至包括父类,所实现的接口等等。那我门可不可以直接让HrPanel去反射调用CollectInfoCenter 呢?答案是:必须可以!
首先,我门来改一改HrPanel这个类中,我门需要做什么!我门还是模拟传入多个方法的场景。
public class HrPanel {
//首先我们需要定义一个
private Set<InvokeMethodUtils> methodList =new HashSet<InvokeMethodUtils>();
//然后写出添加,删除,和真正反射调用的方法
//***
// --------------------
// 调用自定义事件的,反射机制实现过程开始
// *****/
public void attach(Object obj, String method){
this.methodList.add(new InvokeMethodUtils(obj,method));
}
public void detach(Object obj, String method) {
this.methodList.remove(new InvokeMethodUtils(obj, method));
}
public void _panel_BeforeEditorCreate(){
if (this.methodList.isEmpty()){
return;
}
Iterator it =this.methodList.iterator();
while (it.hasNext()){
InvokeMethodUtils m = (InvokeMethodUtils)it.next();
Class objClass = m.getObj().getClass();//get the class of the object
try{
Method method = objClass.getMethod(m.getMethod(),new Class[]{});//no any parameters
method.invoke(m.getObj(),new Object[]{});//no parameters
}catch(Exception e){
e.printStackTrace();
}
}
}
//***
// 调用自定义事件的,反射机制实现过程结束
// --------------------
// *****/
//最后我们在dothis()里面调用反射过程
public void dothis(){
this._panel_BeforeEditorCreate();
}
}
这里我们的组件内部的反射过程就写好了,我们在外面来调用他试试
public class CollectInfoCenter {
public Object GetCollectInfo()
{
HrPanel _panel = new HrPanel();
_panel.attach(this,"_panel_BeforeEditorCreate");
return _panel.dothis();
}
@Override
public void _panel_BeforeEditorCreate(){
System.out.println("--------------------------------");
System.out.println("调用了 CollectInfoCenter 自定义panel事件");
System.out.println("--------------------------------");
}
}
这样,我们来调用panel的dothis()看看结果如何!果不其然,控制台出现了
--------------------------------
调用了 CollectInfoCenter 自定义panel事件
--------------------------------
完美。。。
那有人就说了既然反射这么简单,那么为啥还要用接口模式呢?
当然了,,,代码的精简,带来的是性能的消耗,反射包含了一些动态过程,势必在性能的消耗上就会比非反射的方式要多,并且对于很多安全限制很高的环境中,反射也是不允许被使用的,所以大家在使用的时候还是需要自己斟酌。。。本文仅供参考。。。