智能工厂.apk(点击下载) / SubscriberMethodFinder.java
package org.greenrobot.eventbus;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.greenrobot.eventbus.meta.SubscriberInfo;
import org.greenrobot.eventbus.meta.SubscriberInfoIndex;
/* access modifiers changed from: package-private */
public class SubscriberMethodFinder {
private static final int BRIDGE = 64;
private static final FindState[] FIND_STATE_POOL = new FindState[4];
private static final Map<Class<?>, List<SubscriberMethod>> METHOD_CACHE = new ConcurrentHashMap();
private static final int MODIFIERS_IGNORE = 5192;
private static final int POOL_SIZE = 4;
private static final int SYNTHETIC = 4096;
private final boolean ignoreGeneratedIndex;
private final boolean strictMethodVerification;
private List<SubscriberInfoIndex> subscriberInfoIndexes;
SubscriberMethodFinder(List<SubscriberInfoIndex> list, boolean z, boolean z2) {
this.subscriberInfoIndexes = list;
this.strictMethodVerification = z;
this.ignoreGeneratedIndex = z2;
}
/* access modifiers changed from: package-private */
public List<SubscriberMethod> findSubscriberMethods(Class<?> cls) {
List<SubscriberMethod> list;
List<SubscriberMethod> list2 = METHOD_CACHE.get(cls);
if (list2 != null) {
return list2;
}
if (this.ignoreGeneratedIndex) {
list = findUsingReflection(cls);
} else {
list = findUsingInfo(cls);
}
if (!list.isEmpty()) {
METHOD_CACHE.put(cls, list);
return list;
}
throw new EventBusException("Subscriber " + cls + " and its super classes have no public methods with the @Subscribe annotation");
}
private List<SubscriberMethod> findUsingInfo(Class<?> cls) {
FindState prepareFindState = prepareFindState();
prepareFindState.initForSubscriber(cls);
while (prepareFindState.clazz != null) {
prepareFindState.subscriberInfo = getSubscriberInfo(prepareFindState);
if (prepareFindState.subscriberInfo != null) {
SubscriberMethod[] subscriberMethods = prepareFindState.subscriberInfo.getSubscriberMethods();
for (SubscriberMethod subscriberMethod : subscriberMethods) {
if (prepareFindState.checkAdd(subscriberMethod.method, subscriberMethod.eventType)) {
prepareFindState.subscriberMethods.add(subscriberMethod);
}
}
} else {
findUsingReflectionInSingleClass(prepareFindState);
}
prepareFindState.moveToSuperclass();
}
return getMethodsAndRelease(prepareFindState);
}
private List<SubscriberMethod> getMethodsAndRelease(FindState findState) {
ArrayList arrayList = new ArrayList(findState.subscriberMethods);
findState.recycle();
synchronized (FIND_STATE_POOL) {
int i = 0;
while (true) {
if (i >= 4) {
break;
} else if (FIND_STATE_POOL[i] == null) {
FIND_STATE_POOL[i] = findState;
break;
} else {
i++;
}
}
}
return arrayList;
}
private FindState prepareFindState() {
synchronized (FIND_STATE_POOL) {
for (int i = 0; i < 4; i++) {
FindState findState = FIND_STATE_POOL[i];
if (findState != null) {
FIND_STATE_POOL[i] = null;
return findState;
}
}
return new FindState();
}
}
private SubscriberInfo getSubscriberInfo(FindState findState) {
if (!(findState.subscriberInfo == null || findState.subscriberInfo.getSuperSubscriberInfo() == null)) {
SubscriberInfo superSubscriberInfo = findState.subscriberInfo.getSuperSubscriberInfo();
if (findState.clazz == superSubscriberInfo.getSubscriberClass()) {
return superSubscriberInfo;
}
}
List<SubscriberInfoIndex> list = this.subscriberInfoIndexes;
if (list == null) {
return null;
}
for (SubscriberInfoIndex subscriberInfoIndex : list) {
SubscriberInfo subscriberInfo = subscriberInfoIndex.getSubscriberInfo(findState.clazz);
if (subscriberInfo != null) {
return subscriberInfo;
}
}
return null;
}
private List<SubscriberMethod> findUsingReflection(Class<?> cls) {
FindState prepareFindState = prepareFindState();
prepareFindState.initForSubscriber(cls);
while (prepareFindState.clazz != null) {
findUsingReflectionInSingleClass(prepareFindState);
prepareFindState.moveToSuperclass();
}
return getMethodsAndRelease(prepareFindState);
}
private void findUsingReflectionInSingleClass(FindState findState) {
Method[] methodArr;
try {
methodArr = findState.clazz.getDeclaredMethods();
} catch (Throwable unused) {
methodArr = findState.clazz.getMethods();
findState.skipSuperClasses = true;
}
for (Method method : methodArr) {
int modifiers = method.getModifiers();
if ((modifiers & 1) != 0 && (modifiers & MODIFIERS_IGNORE) == 0) {
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == 1) {
Subscribe subscribe = (Subscribe) method.getAnnotation(Subscribe.class);
if (subscribe != null) {
Class<?> cls = parameterTypes[0];
if (findState.checkAdd(method, cls)) {
findState.subscriberMethods.add(new SubscriberMethod(method, cls, subscribe.threadMode(), subscribe.priority(), subscribe.sticky()));
}
}
} else if (this.strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) {
throw new EventBusException("@Subscribe method " + (method.getDeclaringClass().getName() + "." + method.getName()) + "must have exactly 1 parameter but has " + parameterTypes.length);
}
} else if (this.strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) {
throw new EventBusException((method.getDeclaringClass().getName() + "." + method.getName()) + " is a illegal @Subscribe method: must be public, non-static, and non-abstract");
}
}
}
static void clearCaches() {
METHOD_CACHE.clear();
}
/* access modifiers changed from: package-private */
public static class FindState {
final Map<Class, Object> anyMethodByEventType = new HashMap();
Class<?> clazz;
final StringBuilder methodKeyBuilder = new StringBuilder(128);
boolean skipSuperClasses;
Class<?> subscriberClass;
final Map<String, Class> subscriberClassByMethodKey = new HashMap();
SubscriberInfo subscriberInfo;
final List<SubscriberMethod> subscriberMethods = new ArrayList();
FindState() {
}
/* access modifiers changed from: package-private */
public void initForSubscriber(Class<?> cls) {
this.clazz = cls;
this.subscriberClass = cls;
this.skipSuperClasses = false;
this.subscriberInfo = null;
}
/* access modifiers changed from: package-private */
public void recycle() {
this.subscriberMethods.clear();
this.anyMethodByEventType.clear();
this.subscriberClassByMethodKey.clear();
this.methodKeyBuilder.setLength(0);
this.subscriberClass = null;
this.clazz = null;
this.skipSuperClasses = false;
this.subscriberInfo = null;
}
/* access modifiers changed from: package-private */
public boolean checkAdd(Method method, Class<?> cls) {
Object put = this.anyMethodByEventType.put(cls, method);
if (put == null) {
return true;
}
if (put instanceof Method) {
if (checkAddWithMethodSignature((Method) put, cls)) {
this.anyMethodByEventType.put(cls, this);
} else {
throw new IllegalStateException();
}
}
return checkAddWithMethodSignature(method, cls);
}
private boolean checkAddWithMethodSignature(Method method, Class<?> cls) {
this.methodKeyBuilder.setLength(0);
this.methodKeyBuilder.append(method.getName());
StringBuilder sb = this.methodKeyBuilder;
sb.append('>');
sb.append(cls.getName());
String sb2 = this.methodKeyBuilder.toString();
Class<?> declaringClass = method.getDeclaringClass();
Class put = this.subscriberClassByMethodKey.put(sb2, declaringClass);
if (put == null || put.isAssignableFrom(declaringClass)) {
return true;
}
this.subscriberClassByMethodKey.put(sb2, put);
return false;
}
/* access modifiers changed from: package-private */
public void moveToSuperclass() {
if (this.skipSuperClasses) {
this.clazz = null;
return;
}
this.clazz = this.clazz.getSuperclass();
String name = this.clazz.getName();
if (name.startsWith("java.") || name.startsWith("javax.") || name.startsWith("android.")) {
this.clazz = null;
}
}
}
}