• 用Java注解+反射模擬Guava中EventBus

    2016-08-16

    之前使用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學習之路還很漫長,幸運的是我在剛畢業就遇到了兩個好老師——宏哲和超哥,不幸的是兩個人不到半年都離職了,而我也離開了原來的公司,本來想到北京尋找更大的平臺,結果現在這家公司卻各方面不盡如人意,現在唯一能靠的只有自己了,帶著兩位前輩教給我的求知精神獨自在技術的道路上走下去吧……


    天堂网