Declared 可以理解为所有的意思
package com.itheima.d5_reflect_method;import org.junit.Test;import java.lang.reflect.Method;/**目标:反射——获取Method方法对象反射获取类的Method方法对象:1、Method getMethod(String name,Class...args);根据方法名和参数类型获得对应的方法对象,只能获得public的2、Method getDeclaredMethod(String name,Class...args);根据方法名和参数类型获得对应的方法对象,包括private的3、Method[] getMethods();获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的4、Method[] getDeclaredMethods();获得类中的所有成员方法对象,返回数组,只获得本类申明的方法。Method的方法执行:Object invoke(Object obj, Object... args)参数一:触发的是哪个对象的方法执行。参数二: args:调用方法时传递的实际参数*/public class MethodDemo01 {/*** 1.获得类中的所有成员方法对象*/@Testpublic void getDeclaredMethods(){// a. 获取类对象Class c = Dog.class;// b. 提取全部方法;包括私有的 得到的是一个Method类型的数组 Method[]Method[] methods = c.getDeclaredMethods();// c. 遍历全部方法 得到的是方法对象for (Method method : methods) {// 得到了方法对象,可以调用其getName方法,获取方法名System.out.println(method.getName() + "返回值类型:" + method.getReturnType());}/** 输出结果:* getName返回值类型:class java.lang.String* run返回值类型:void* setName返回值类型:void* eat返回值类型:void* eat返回值类型:class java.lang.String* inAddr返回值类型:void*/}/*** 2. 获取某个方法对象*/@Testpublic void getDeclardMethod() throws Exception {// a. 获取类对象Class c = Dog.class;// b. 提取单个方法对象 // 有参方法,和无参方法Method m = c.getDeclaredMethod("eat");//Method m2 = c.getDeclaredMethod("eat", String.class);// 暴力打开权限 一般是获取完方法对象后再打开权限// 因为两个eat 方法都是private修饰的,所以要暴力打开它m.setAccessible(true); // 可以理解该方法为: 设置可访问的m2.setAccessible(true);// c. 触发方法的执行/*** Method的方法执行:* Object invoke(Object obj, Object... args)* 参数一:触发的是哪个对象的方法执行。* 参数二: args:调用方法时传递的实际参数*/Dog d = new Dog();// 注意: 方法如果是没有结果回来的,那么返回的是nullObject result = m.invoke(d); // invoke是调用的意思, 这里是方法对象的调用System.out.println(result); // 没有返回结果(没有result关键字)Object result2 = m2.invoke(d, "骨头");// d是Dog对象,是触发Dog类的对象执行System.out.println(result2);}/*** 狗吃骨头* null* 狗吃骨头* 吃的很开心!*/}
package com.itheima.d5_reflect_method;public class Dog {private String name ;public Dog(){}public Dog(String name) {this.name = name;}public void run(){System.out.println("狗跑的贼快~~");}private void eat(){System.out.println("狗吃骨头");}private String eat(String name){System.out.println("狗吃" + name);return "吃的很开心!";}public static void inAddr(){System.out.println("在黑马学习Java!");}public String getName() {return name;}public void setName(String name) {this.name = name;}}
