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.获得类中的所有成员方法对象
*/
@Test
public 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. 获取某个方法对象
*/
@Test
public 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();
// 注意: 方法如果是没有结果回来的,那么返回的是null
Object 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;
}
}