方法的反射
1、如何获取某个方法
方法的名称和方法的参数列表才能唯一决定某个方法
2、方法反射的操作
method.invoke(对象,参数列表)
public class MethodDemo1 {
public static void main(String[] args) {
/**思考:如何获得方法对象,然后用方法对象进行反射操作
* 1、要获取一个方法首先要获取类的信息,获取类的信息首先要获取类的类类型
* 2、获取方法必须要有名称和参数列表来决定
*/
//1、首先要获取类的信息,获取类的信息首先要获取类的类类型
A a1=new A();
Class c = a1.getClass();
/*2、获取方法 名称和参数列表来决定
* getMethod获取的是public的方法
* getDeclaredMethod()获取自己声明的方法
*/
try {
//获取print(int,int)方法.
System.out.println("=================获取print(int,int)===============");
//这个一定会抛出异常,我们这里简单的处理一下异常,原因:万一这个方法(带两个整型参数的方法)不存在呢
Method method = c.getMethod("print", new Class[]{int.class,int.class});//这个方法中“...”代表可变参数,当有几个参数的时候,可以new Class数组
//也可以这样写:有几个参数就传几个参数
Method method2 = c.getMethod("print", int.class,int.class);
a1.print(10, 20);//普通调用(可以理解为a1这个对象操作方法对象print)
/*方法的反射操作是用method/method2对象来进行方法调用 和a1.print()调用的效果完全相同
*方法如果没有返回值,返回null。有返回值就返回具体的返回值如下面的Object o
*/
Object o = method.invoke(a1, new Object[]{10,20});//方法的反射(可以理解为print这个方法对象,即method/method2来操作a1,即上面普通调用反过来操作,通过invoke来进行操作)
//也可以这样:
Object o1 = method.invoke(a1, 10,20);
System.out.println("=================获取print(String,String)===============");
//获取方法print(String,String)
Method method3 = c.getMethod("print", String.class,String.class);
a1.print("hello", "world");//普通调用
//对方法进行反射操作
Object o2 = method3.invoke(a1, "hello","world");
System.out.println("=================获取print()无参方法===============");
// Method method4 = c.getMethod("print", new Class[]{});
Method method5 = c.getMethod("print");//没有参数就不传
// method5.invoke(a1, new Object[]{});
method5.invoke(a1);
}catch (Exception e) {
e.printStackTrace();
}
}
}
class A{
public void print(){
System.out.println("hello world");
}
public void print(int a,int b){
System.out.println(a+b);
}
public void print(String a,String b){
System.out.println(a.toUpperCase()+","+b.toUpperCase());
}
}