private Method[] getClassMethods(Class>cls) {
Map uniqueMethods = new HashMap();
Class> currentClass =cls;while (currentClass != null && currentClass != Object.class) {
addUniqueMethods(uniqueMethods, currentClass.getDeclaredMethods());//获取接口中的所有方法
Class>[] interfaces =currentClass.getInterfaces();for (Class>anInterface : interfaces) {
addUniqueMethods(uniqueMethods, anInterface.getMethods());
}//获取父类,继续while循环
currentClass =currentClass.getSuperclass();
}
Collection methods =uniqueMethods.values();return methods.toArray(newMethod[methods.size()]);
}private void addUniqueMethods(MapuniqueMethods, Method[] methods) {for(Method currentMethod : methods) {if (!currentMethod.isBridge()) {//获取方法的签名,格式是:返回值类型#方法名称:参数类型列表
String signature =getSignature(currentMethod);//检查是否在子类中已经添加过该方法,如果在子类中已经添加过,则表示子类覆盖了该方法,无须再向uniqueMethods集合中添加该方法了
if (!uniqueMethods.containsKey(signature)) {if(canControlMemberAccessible()) {try{
currentMethod.setAccessible(true);
}catch(Exception e) {//Ignored. This is only a final precaution, nothing we can do.
}
}
uniqueMethods.put(signature, currentMethod);
}
}
}
}privateString getSignature(Method method) {
StringBuilder sb= newStringBuilder();
Class> returnType =method.getReturnType();if (returnType != null) {
sb.append(returnType.getName()).append('#');
}
sb.append(method.getName());
Class>[] parameters =method.getParameterTypes();for (int i = 0; i < parameters.length; i++) {if (i == 0) {
sb.append(':');
}else{
sb.append(',');
}
sb.append(parameters[i].getName());
}returnsb.toString();
}/*** Checks whether can control member accessible.
*
*@returnIf can control member accessible, it return {@literaltrue}
*@since3.5.0*/
public static booleancanControlMemberAccessible() {try{
SecurityManager securityManager=System.getSecurityManager();if (null !=securityManager) {
securityManager.checkPermission(new ReflectPermission("suppressAccessChecks"));
}
}catch(SecurityException e) {return false;
}return true;
}