zoukankan      html  css  js  c++  java
  • Java 反射机制:(八)获取运行时类的方法结构

    一、获取方法结构

      1、getMethods()

        getMethods():获取当前运行时类及其所有父类中声明为public权限的方法

        Demo:

     1     @Test
     2     public void test1() {
     3 
     4         Class clazz = Person.class;
     5 
     6         //getMethods():获取当前运行时类及其所有父类中声明为public权限的方法
     7         Method[] methods = clazz.getMethods();
     8         for (Method m : methods) {
     9             System.out.println(m);
    10         }
    11     }

         运行结果:

      2、getDeclaredMethods()

        getDeclaredMethods():获取当前运行时类中声明的所有方法。(不包含父类中声明的方法)

        Demo:

     1     @Test
     2     public void test3() {
     3 
     4         Class clazz = Person.class;
     5 
     6         //getDeclaredMethods():获取当前运行时类中声明的所有方法。(不包含父类中声明的方法)
     7         Method[] declaredMethods = clazz.getDeclaredMethods();
     8         for(Method m : declaredMethods){
     9             System.out.println(m);
    10         }
    11     }

        运行结果:

      3、getMethod(String name, Class<?> ... parameterTypes)

        getMethod(String name, Class<?> ... parameterTypes):根据方法名获取指定的public修饰的某个方法(包含父类中继承的);

        Demo:

     1     @Test
     2     public void test3() throws NoSuchMethodException {
     3 
     4         Class clazz = Person.class;
     5 
     6         /*
     7         获取指定的public修饰的某个方法
     8         getMethod():参数1 :指明获取的方法的名称  参数2:指明获取的方法的形参列表
     9          */
    10         Method show = clazz.getMethod("display", String.class, int.class);
    11         System.out.println(show);
    12 
    13     }

      4、getDeclaredMethod(String name, Class<?> ... parameterTypes)

        getDeclaredMethod(String name, Class<?> ... parameterTypes):获取本类中指定的某个方法,忽略权限修饰符(不包含父类继承的)。

        Demo:

     1     @Test
     2     public void test4() throws NoSuchMethodException {
     3 
     4         Class clazz = Person.class;
     5 
     6         /*
     7         获取本类中指定的某个方法
     8         getDeclaredMethod():参数1 :指明获取的方法的名称  参数2:指明获取的方法的形参列表
     9          */
    10         Method show = clazz.getDeclaredMethod("show", String.class);
    11         System.out.println(show);
    12 
    13     }

       说明:

        ① name 参数是一个 String 对象,它指定所需方法的简称

        ② parameterTypes 参数是 Class 对象的一个数组或 0~n个 Class 对象,它按声明顺序标识该方法的形参类型

        ③ 如果是无参方法,那么 parameterTypes 可以不传或者传 null。

        ④ 因为可能存在重载的方法,所以在一个类中唯一确定一个方法,需要方法名和形参类型列表。

    二、获取方法的信息

        一个类中的方法可以有修饰符,返回值类型,方法名和异常列表等信息。这些都可以获取到。

        常用方法:

    public Class<?> getReturnType()取得全部的返回值
    public Class<?>[] getParameterTypes()取得全部的参数
    public int getModifiers()取得修饰符
    public Class<?>[] getExceptionTypes()取得异常信息

    public String getName()获取方法名

    public Annotation[] getAnnotations()获取注解信息

        

        Demo:

     1     /*
     2     @Xxxx
     3     权限修饰符  返回值类型  方法名(参数类型1 形参名1,...) throws XxxException{}
     4      */
     5     @Test
     6     public void test(){
     7         Class clazz = Person.class;
     8         Method[] declaredMethods = clazz.getDeclaredMethods();
     9         for(Method m : declaredMethods){
    10             //1.获取方法声明的注解
    11             Annotation[] annos = m.getAnnotations();
    12             for(Annotation a : annos){
    13                 System.out.println(a);
    14             }
    15 
    16             //2.权限修饰符
    17             System.out.print(Modifier.toString(m.getModifiers()) + "	");
    18 
    19             //3.返回值类型
    20             System.out.print(m.getReturnType().getName() + "	");
    21 
    22             //4.方法名
    23             System.out.print(m.getName());
    24             System.out.print("(");
    25             //5.形参列表
    26             Class[] parameterTypes = m.getParameterTypes();
    27             if(!(parameterTypes == null && parameterTypes.length == 0)){
    28                 for(int i = 0;i < parameterTypes.length;i++){
    29 
    30                     if(i == parameterTypes.length - 1){
    31                         System.out.print(parameterTypes[i].getName() + " args_" + i);
    32                         break;
    33                     }
    34 
    35                     System.out.print(parameterTypes[i].getName() + " args_" + i + ",");
    36                 }
    37             }
    38 
    39             System.out.print(")");
    40 
    41             //6.抛出的异常
    42             Class[] exceptionTypes = m.getExceptionTypes();
    43             if(exceptionTypes.length > 0){
    44                 System.out.print("throws ");
    45                 for(int i = 0;i < exceptionTypes.length;i++){
    46                     if(i == exceptionTypes.length - 1){
    47                         System.out.print(exceptionTypes[i].getName());
    48                         break;
    49                     }
    50 
    51                     System.out.print(exceptionTypes[i].getName() + ",");
    52                 }
    53             }
    54 
    55             System.out.println();
    56         }
    57     }

        运行结果:

  • 相关阅读:
    困难的图论
    [Poi2011]Meteors
    四维偏序
    bzoj2738矩阵乘法
    创建线程的三种方式
    java邮件发送
    Nginx配置文件分析
    如何理解java反射?
    正则表达式
    jenkins新手入门教程
  • 原文地址:https://www.cnblogs.com/niujifei/p/14883141.html
Copyright © 2011-2022 走看看