zoukankan      html  css  js  c++  java
  • Java获取类中的所有方法

    一、获取当前类定义的所有方法,不包括父类和接口的

    class.getDeclaredMethods()

    eg:

    import java.lang.reflect.Method;
    
    public class testH {
        //获取java类的所有方法并打印出来
        public static void main(String args[]) {
            Class c = SSOUtil.class;
            Method[] m = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++) {
                System.out.println(m[i].getName());
            }
        }
    }

    会返回当前类定义的所有方法(包括私有的、静态的、抽象的),但是不会返回接口和父类中定义的方法

    二、获取当前类所有的public方法,包括父类和接口的

    class.getMethods()

    会返回当前类所有的public方法,包括接口和父类中定义的public方法。

    三、获取当前类中所有的方法,包括父类和接口的

    private Method[] getClassMethods(Class<?> cls) {
        Map<String, Method> uniqueMethods = new HashMap<String, Method>();
        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<Method> methods = uniqueMethods.values();
    
        return methods.toArray(new Method[methods.size()]);
      }
    
      private void addUniqueMethods(Map<String, Method> uniqueMethods, 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);
            }
          }
        }
      }
    
      private String getSignature(Method method) {
        StringBuilder sb = new StringBuilder();
        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());
        }
        return sb.toString();
      }
    
      /**
       * Checks whether can control member accessible.
       *
       * @return If can control member accessible, it return {@literal true}
       * @since 3.5.0
       */
      public static boolean canControlMemberAccessible() {
        try {
          SecurityManager securityManager = System.getSecurityManager();
          if (null != securityManager) {
            securityManager.checkPermission(new ReflectPermission("suppressAccessChecks"));
          }
        } catch (SecurityException e) {
          return false;
        }
        return true;
      }

    转载自:https://blog.csdn.net/u011983531/article/details/80248945

  • 相关阅读:
    第六章 实验报告(函数与宏定义)
    第三次实验报告
    第五章 循环结构课后反思
    第二次实验报告
    第一次实验报告
    第一次作业
    第九章 结构体与共用体
    第八章 指针实验
    第7章 数组实验
    第六章 函数和宏定义实验(2)
  • 原文地址:https://www.cnblogs.com/hd92/p/13566126.html
Copyright © 2011-2022 走看看