之前使用EventBus,感覺通過Java的注解和反射能夠模擬它的工作過程,今天做了嘗試,主要實現訂閱者訂閱指定類型的消息,如果發送的消息是該類型則接收,否則就不接收。效果還不錯,基本的功能都實現了。下面直接上代碼。
首先要定義一個注解,用來標記訂閱的方法:
package myeventbus; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import com.google.common.annotations.Beta; @Beta @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MySubScribe { }然后是事件類MyEvent和訂閱者MyEventSubscriber
package myeventbus; public class MyEvent { private int massage; public MyEvent(int massage){ this.massage = massage; } public int getMassage(){ return massage; } }
package myeventbus; public class MyEventSubscriber { private int massage; @MySubScribe public void listen(MyEvent event){ this.massage = event.getMassage(); } public int getMassage(){ return massage; } }
自己模擬的EventBus類
package myeventbus; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MyEventBus { @SuppressWarnings("unused") private Object massage; private Class<?> cl; private Object obj; public void register(Object obj) { cl = obj.getClass(); this.obj = obj; } public void post(Object massage) { this.massage = massage; for (Method m : cl.getDeclaredMethods()) { MySubScribe sub = m.getAnnotation(MySubScribe.class); if (sub != null) { Class<?>[] params = m.getParameterTypes(); if (massage.getClass().equals(params[0])) { try { m.invoke(obj, massage); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } } } }
最后是測試類
package myeventbus; public class MyEventBusTest { public static void main(String[] args) { MyEventSubscriber eventSubscriber = new MyEventSubscriber(); MyEventBus eventBus = new MyEventBus(); eventBus.register(eventSubscriber); eventBus.post(new MyEvent(200)); System.out.println(eventSubscriber.getMassage()); } }
這里僅僅是模擬,真正的源碼我還沒有看,主要是為了熟悉注解和反射的一些用法,Java學習之路還很漫長,幸運的是我在剛畢業就遇到了兩個好老師——宏哲和超哥,不幸的是兩個人不到半年都離職了,而我也離開了原來的公司,本來想到北京尋找更大的平臺,結果現在這家公司卻各方面不盡如人意,現在唯一能靠的只有自己了,帶著兩位前輩教給我的求知精神獨自在技術的道路上走下去吧……