EventBusの購読方法はなぜpublicですか?Subscriber class WebFragment and its super classes have no public methods...
2696 ワード
EventBus-なぜ購読する方法はpublicでなければならないのですか?
ソースコードを見てみると、
EventBusは、private修飾メソッドは呼び出しを反射できますが、setAccessでアクセス権を変更する必要があります.修正するとjavaの役割ドメインが破壊され、やむを得ず推奨されません.EventBusは3つのライブラリとして、privateに設定したときに、親切に悪いことをしたり、強制的にアクセスしたりすることは明らかではありません.
ソースコードを見てみると、
private void findUsingReflectionInSingleClass(FindState findState) {
Method[] methods;
try {
// This is faster than getMethods, especially when subscribers are fat classes like Activities
//
methods = findState.clazz.getDeclaredMethods();
} catch (Throwable th) {
// Workaround for java.lang.NoClassDefFoundError, see https://github.com/greenrobot/EventBus/issues/149
methods = findState.clazz.getMethods();
findState.skipSuperClasses = true;
}
for (Method method : methods) {
//
int modifiers = method.getModifiers();
// public
if ((modifiers & Modifier.PUBLIC) != 0 && (modifiers & MODIFIERS_IGNORE) == 0) {
Class>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == 1) {
Subscribe subscribeAnnotation = method.getAnnotation(Subscribe.class);
if (subscribeAnnotation != null) {
Class> eventType = parameterTypes[0];
if (findState.checkAdd(method, eventType)) {
ThreadMode threadMode = subscribeAnnotation.threadMode();
findState.subscriberMethods.add(new SubscriberMethod(method, eventType, threadMode,
subscribeAnnotation.priority(), subscribeAnnotation.sticky()));
}
}
} else if (strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) {
String methodName = method.getDeclaringClass().getName() + "." + method.getName();
throw new EventBusException("@Subscribe method " + methodName +
"must have exactly 1 parameter but has " + parameterTypes.length);
}
} else if (strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) {
// , @Subscribe , public , ,
String methodName = method.getDeclaringClass().getName() + "." + method.getName();
throw new EventBusException(methodName +
" is a illegal @Subscribe method: must be public, non-static, and non-abstract");
}
}
}
EventBusは、private修飾メソッドは呼び出しを反射できますが、setAccessでアクセス権を変更する必要があります.修正するとjavaの役割ドメインが破壊され、やむを得ず推奨されません.EventBusは3つのライブラリとして、privateに設定したときに、親切に悪いことをしたり、強制的にアクセスしたりすることは明らかではありません.