java反射获取和调用方法
Class类中获取方法:
publicMethod[]getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>
publicMethod[]getDeclaredMethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
在jdk1.8后可以直接获取私有属性的方法不需要设置权限但是仅限于getDeclaredMethod方法对于Method的方法仍然需要设置
权限。
publicMethod[]getMethod(StringmethodName,Class
参数:methodName:表示获取的方法的名字
parameterTypes:表示获取的方法的参数的Class类型
publicMethod[]getDeclaredMethod(StringmethodName,Class
Classclazz=newPerson().getClass(); try{ //调用指定的方法 /*@SuppressWarnings("unchecked") Methodme=clazz.getDeclaredMethod("getName",String.class); me.invoke(clazz.newInstance(),"zhangsan");*/ //获取所有的方法 Method[]methods=clazz.getDeclaredMethods(); for(Methodmethod:methods){ System.out.println(method.getName()); } }catch(Exceptione){ e.printStackTrace(); }
对于多个参数的方法调用:getDeclaredMethod后面跟的parameterTypes可以理解为Class类型的形参,通过调用invoke来赋实参多个参数的赋值最好是包装在newObject[]{}中。
@SuppressWarnings("unchecked") Methodmethod=clazz.getDeclaredMethod("getName",newClass[]{String.class,int.class}); method.invoke(newPerson(),newObject[]{"zhangsan",10});
调用静态方法
classUser{ publicstaticvoidstaticMethod(){ System.out.println(“staticmthodinvoke.”); } } Eg: Classclz=User.class; MethodstaticMethod=clz.getMethod(“staticMthod”);
两种方式调用静态方法:
1.因为静态方法属于所有实例对象公共的,可以创建该类的一个任意对象,通过该对象调用
staticMethod.invoke(clz.newInstance());//staticMethod无参,故参数列表类型不填
2.如果底层方法是静态的,那么可以忽略指定的obj参数,将obj参数设置为null即可
staticMethod.invoke(null);
更多相关的内容:
一:反射概念
可以通过Class类获取某个类的成员变量以及方法,并且调用之。
二:通过反射获取方法、变量、构造方法
@Test //通过反射获取类定义的方法 publicvoidtestMethod()throwsException{ @SuppressWarnings("rawtypes") Classclazz=Class.forName("java.lang.String"); Method[]m=clazz.getDeclaredMethods(); for(inti=0;i三:通过反射调用类定义的方法
@Test //通过反射调用类定义的方法 publicvoidtestInvokeMethod()throwsException{ Classclazz=Class.forName("java.lang.String"); //定义参数类型 Class[]params=newClass[1]; params[0]=String.class; Methodm=clazz.getDeclaredMethod("indexOf",params); //设置参数 Object[]p=newObject[1]; p[0]="e"; Integers=(Integer)m.invoke("helloworld!",p); System.out.println(s); }