一、获取方法结构

  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()) + "\t");
18 
19             //3.返回值类型
20             System.out.print(m.getReturnType().getName() + "\t");
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     }

 

    运行结果:

 

posted on 2021-06-14 19:37  格物致知_Tony  阅读(416)  评论(0编辑  收藏  举报