一、获取方法结构
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 }
运行结果: