EventBus系列:模仿EventBus,自定义注解

找到带有@Subscribe注解的方法,并且调用。
先看看@Subscribe的源码:

@Documented  
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
    ThreadMode threadMode() default ThreadMode.POSTING;

    boolean sticky() default false;

    int priority() default 0;
}
  • @Documented 意味着@Subscribe注解会在API文档中显示,如果对这一点不熟悉,可以参考:@Documented注解的作用
  • @Retention(RetentionPolicy.RUNTIME)表示@Subscribe注解,在被编译成.class文件和运行时都不会被丢弃,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。对与Retention如果不熟悉,可以参考:@Retention注解的作用
  • @Target({ElementType.METHOD})表示修饰方法
  • 注解内部有三个属性:threadMode、sticky、priority。
    使用@Subscribe注解的示例如下:
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void updateName(String name) {
        tvName.setText("姓名改为:" + name);
    }


	//priority较大的订阅方法,会先接受到事件,可以用priority来控制接受事件顺序
	@Subscribe(threadMode = ThreadMode.MAIN,priority = 100) 
	public void onEvent(MainMessage event) {
	
	}

前面是对@Subscribe注解的分析,下面开始自定义注解,然后用反射获取带有注解的方法。关于自定义注解,可以参考:Java 自定义注解及使用场景

//先定义一个Receiver注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Receiver {
    int priority() default 0; //增加个priority属性,加点难度
}

//事件接受者,使用@Receiver注解
public class ReceiveObj {
    private String receivedMsg;

    @Receiver(priority = 66)
    public void onReceivedMsg() {
        System.out.println("onReceivedMsg被调用!");
    }
}


//通过反射获取注解值,并且调用被注解的方法
public class ReceiverTest {
    public static void main(String[] args) {
        ReceiveObj obj = new ReceiveObj();
        Class<ReceiveObj> receiveObjClass = (Class<ReceiveObj>) obj.getClass();
        Method[] methodList = receiveObjClass.getMethods();
        for (Method method : methodList) {
            Receiver receiver = method.getDeclaredAnnotation(Receiver.class);
            if (receiver != null) {
                System.out.println("priority值:" + receiver.priority());
                try {
                    method.invoke(obj);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值