找到带有@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();
}
}
}
}
}
运行结果: