栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 receiveObjClass = (Class) 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();
                }
            }
        }
    }
}

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/314655.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号