美文网首页
获取Java类中的所有方法

获取Java类中的所有方法

作者: m曲终杯盏凉 | 来源:发表于2019-01-07 14:39 被阅读21次

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

XXX.class.getDeclaredMethods()

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


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

XXX.class.getMethods()

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


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

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

相关文章

  • Android 时间获取及格式化

    Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现...

  • 获取Java类中的所有方法

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

  • Java 静态方法获取当前类

    Java中静态方法不依赖于具体的实例存在,所有不能直接使用this指针,需要别的方式间接的获取到类名。 方法 方法...

  • Android ndk 中c 调用Java

    c调用java 中的方法 c代码中通过反射得到java 对象 1.新建Java类 2新建C文件 获取Java方法的...

  • jni调用java类的属性和方法(一)

    正文 1.访问类方法 1.1 获取类 jni中c/c++想要调用java中的类,就必须先找到这个类,在java中,...

  • 使用反射机制实现javaBean的自动封装

    1 反射 什么是java反射呢?简单的说,对于java中任意一个类,利用反射都可以获取该类中的所有属性和方法,而对...

  • JAVA-Reflect

    一、Class类的使用 二、Java动态加载类 三、Java获取方法信息 四、Java方法的反射

  • Java反射

    一. Class类 二. Java动态加载类 三. Java获取方法信息 四. Java方法反射的基本操作

  • equals()方法与hashCode()方法

    在Java中,equals()方法与hashCode方法定义在java.lang.Object类中,意味着所有的类...

  • Java反射API

    Java反射API Java反射机制提供的功能 获取一个类的所有成员变量及方法(含构造方法(有/无 参数)) 创建...

网友评论

      本文标题:获取Java类中的所有方法

      本文链接:https://www.haomeiwen.com/subject/ktsurqtx.html