This commit is contained in:
Redkale
2017-11-23 08:56:40 +08:00
parent dddb2397c4
commit 6c11ef70d4

View File

@@ -777,25 +777,27 @@ public final class ResourceFactory {
this.listener = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findListener(t, field.getType()); this.listener = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findListener(t, field.getType());
} }
private static synchronized Method findListener(Class clazz, Class fieldType) { private static Method findListener(Class clazz, Class fieldType) {
Class loop = clazz; synchronized (listenerMethods) {
Method m = listenerMethods.get(clazz.getName() + "-" + fieldType.getName()); Class loop = clazz;
if (m != null) return m; Method m = listenerMethods.get(clazz.getName() + "-" + fieldType.getName());
do { if (m != null) return m;
for (Method method : loop.getDeclaredMethods()) { do {
if (method.getAnnotation(ResourceListener.class) != null for (Method method : loop.getDeclaredMethods()) {
&& method.getParameterCount() == 3 if (method.getAnnotation(ResourceListener.class) != null
&& String.class.isAssignableFrom(method.getParameterTypes()[0]) && method.getParameterCount() == 3
&& method.getParameterTypes()[1] == method.getParameterTypes()[2] && String.class.isAssignableFrom(method.getParameterTypes()[0])
&& method.getParameterTypes()[1].isAssignableFrom(fieldType)) { && method.getParameterTypes()[1] == method.getParameterTypes()[2]
m = method; && method.getParameterTypes()[1].isAssignableFrom(fieldType)) {
m.setAccessible(true); m = method;
break; m.setAccessible(true);
break;
}
} }
} } while ((loop = loop.getSuperclass()) != Object.class);
} while ((loop = loop.getSuperclass()) != Object.class); listenerMethods.put(clazz.getName() + "-" + fieldType.getName(), m);
listenerMethods.put(clazz.getName() + "-" + fieldType.getName(), m); return m;
return m; }
} }
} }