反射工具抽象类,处理方法及字段。主要通过MethodCallback,MethodFilter,FieldCallback,FieldFilter。
其类结构如下
1、主要方法
1.1 doWithMethods
遍历clazz层级关系的方法(包含父类的),通过MethodFilter过滤 ,MethodCallback回调来处理方法。在处理父类时,如果方法过滤器不为用户定义方法或者为用户定义方法不是不包含Object的方法。如果为接口类型,则处理接口方法
public static void doWithMethods(Class<?> clazz, MethodCallback mc, @Nullable MethodFilter mf) {
// Keep backing up the inheritance hierarchy.
Method[] methods = getDeclaredMethods(clazz, false);
for (Method method : methods) {
if (mf != null && !mf.matches(method)) {
continue;
}
try {
mc.doWith(method);
}
catch (IllegalAccessException ex) {
throw new IllegalStateException("Not allowed to access method '" + method.getName() + "': " + ex);
}
}
if (clazz.getSuperclass() != null && (mf != USER_DECLARED_METHODS || clazz.getSuperclass() != Object.class)) {
doWithMethods(clazz.getSuperclass(), mc, mf);
}
else if (clazz.isInterface()) {
for (Class<?> superIfc : clazz.getInterfaces()) {
doWithMethods(superIfc, mc, mf);
}
}
}
1.2 doWithLocalMethods
只处理本层级的方法,不包含父类的
public static void doWithLocalMethods(Class<?> clazz, MethodCallback mc) {
Method[] methods = getDeclaredMethods(clazz, false);
for (Method method : methods) {
try {
mc.doWith(method);
}
catch (IllegalAccessException ex) {
throw new IllegalStateException("Not allowed to access method '" + method.getName() + "': " + ex);
}
}
}