Declared 可以理解为所有的意思
    image.png

    1. package com.itheima.d5_reflect_method;
    2. import org.junit.Test;
    3. import java.lang.reflect.Method;
    4. /**
    5. 目标:反射——获取Method方法对象
    6. 反射获取类的Method方法对象:
    7. 1、Method getMethod(String name,Class...args);
    8. 根据方法名和参数类型获得对应的方法对象,只能获得public的
    9. 2、Method getDeclaredMethod(String name,Class...args);
    10. 根据方法名和参数类型获得对应的方法对象,包括private的
    11. 3、Method[] getMethods();
    12. 获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的
    13. 4、Method[] getDeclaredMethods();
    14. 获得类中的所有成员方法对象,返回数组,只获得本类申明的方法。
    15. Method的方法执行:
    16. Object invoke(Object obj, Object... args)
    17. 参数一:触发的是哪个对象的方法执行。
    18. 参数二: args:调用方法时传递的实际参数
    19. */
    20. public class MethodDemo01 {
    21. /**
    22. * 1.获得类中的所有成员方法对象
    23. */
    24. @Test
    25. public void getDeclaredMethods(){
    26. // a. 获取类对象
    27. Class c = Dog.class;
    28. // b. 提取全部方法;包括私有的 得到的是一个Method类型的数组 Method[]
    29. Method[] methods = c.getDeclaredMethods();
    30. // c. 遍历全部方法 得到的是方法对象
    31. for (Method method : methods) {
    32. // 得到了方法对象,可以调用其getName方法,获取方法名
    33. System.out.println(method.getName() + "返回值类型:" + method.getReturnType());
    34. }
    35. /** 输出结果:
    36. * getName返回值类型:class java.lang.String
    37. * run返回值类型:void
    38. * setName返回值类型:void
    39. * eat返回值类型:void
    40. * eat返回值类型:class java.lang.String
    41. * inAddr返回值类型:void
    42. */
    43. }
    44. /**
    45. * 2. 获取某个方法对象
    46. */
    47. @Test
    48. public void getDeclardMethod() throws Exception {
    49. // a. 获取类对象
    50. Class c = Dog.class;
    51. // b. 提取单个方法对象 // 有参方法,和无参方法
    52. Method m = c.getDeclaredMethod("eat");//
    53. Method m2 = c.getDeclaredMethod("eat", String.class);
    54. // 暴力打开权限 一般是获取完方法对象后再打开权限
    55. // 因为两个eat 方法都是private修饰的,所以要暴力打开它
    56. m.setAccessible(true); // 可以理解该方法为: 设置可访问的
    57. m2.setAccessible(true);
    58. // c. 触发方法的执行
    59. /**
    60. * Method的方法执行:
    61. * Object invoke(Object obj, Object... args)
    62. * 参数一:触发的是哪个对象的方法执行。
    63. * 参数二: args:调用方法时传递的实际参数
    64. */
    65. Dog d = new Dog();
    66. // 注意: 方法如果是没有结果回来的,那么返回的是null
    67. Object result = m.invoke(d); // invoke是调用的意思, 这里是方法对象的调用
    68. System.out.println(result); // 没有返回结果(没有result关键字)
    69. Object result2 = m2.invoke(d, "骨头");// d是Dog对象,是触发Dog类的对象执行
    70. System.out.println(result2);
    71. }
    72. /**
    73. * 狗吃骨头
    74. * null
    75. * 狗吃骨头
    76. * 吃的很开心!
    77. */
    78. }
    1. package com.itheima.d5_reflect_method;
    2. public class Dog {
    3. private String name ;
    4. public Dog(){
    5. }
    6. public Dog(String name) {
    7. this.name = name;
    8. }
    9. public void run(){
    10. System.out.println("狗跑的贼快~~");
    11. }
    12. private void eat(){
    13. System.out.println("狗吃骨头");
    14. }
    15. private String eat(String name){
    16. System.out.println("狗吃" + name);
    17. return "吃的很开心!";
    18. }
    19. public static void inAddr(){
    20. System.out.println("在黑马学习Java!");
    21. }
    22. public String getName() {
    23. return name;
    24. }
    25. public void setName(String name) {
    26. this.name = name;
    27. }
    28. }