6.反射方法的获取和调用(反射的作用就是写框架和工具类,平时少用反射,因为反射操作非常消耗性能)
方法获取思路:1.方法获取 思路过程:1.获取类对应的class对象 2.通过class对象调用API中的方法获取该类中的方法
方法调用思路:1.获取类的字节码对象 2.通过字节码对象获取类中的方法对象 3.通过方法对象调用Class中的方法invoke来调用执行方法 参数obj:为方法对象所在的底层类对象 args:为方法实际所传的参数 返回值以object来接收
* 如果没有返回值则不接收
package javaInvoke;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 通过类的class对象获取对象的方法并且调用方法
* @author Administrator
*
*/
class test{
public test(){
}
/*
private test(){
}
*/
public test(String name){
}
public test(String name,int items){
}
private test(String name,int items,double dou){
}
public String sayHello(String name){
System.out.println("你好"+name+"\n");
return name;
}
public void sayHi(String name,String city){
System.out.println("你好"+city+"的"+name);
}
private void sayGoodBye(String name){
System.out.println("再见"+name);
}
}
public class invokeMethod {
/**
*方法获取 思路过程:1.获取类对应的class对象 2.通过class对象调用API中的方法获取该类中的方法
*
* @param args
* @throws SecurityException
* @throws NoSuchMethodException
* @throws InstantiationException
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static void main(String[] args) throws Exception {
/*获取类对应的字节码对象*/
Class claz = test.class;
/*获取类中所有public方法以及所有的继承方法和接口*/
Method[] meths = claz.getMethods();
for(Method meth:meths){
System.out.println(meth+"获取所有public方法和继承的方法");
}
/*获取指定的方法(public修饰)*/
Method me = claz.getMethod("sayHello", String.class);
System.out.println(me+"获取指定参数的方法");
/*获取指定的私有方法*/
Method mee = claz.getDeclaredMethod("sayGoodBye", String.class);
System.out.println(mee+"获取指定的私有方法");
/*************************方法调用*****************************/
/**
* 方法调用思路:1.获取类的字节码对象 2.通过字节码对象获取类中的方法对象 3.通过方法对象调用Class中的方法invoke来调用执行方法 参数obj:为方法对象所在的底层类对象 args:为方法实际所传的参数 返回值以object来接收
* 如果没有返回值则不接收
* public Object invoke(Object obj,Object args);
*/
Object obj= me.invoke(claz.newInstance(), "反射方法的参数");
System.out.println(obj+"***"+"执行反射方法返回的结果");
/*调用私有方法*/
/*调用私有方法之前必须设置安全访问权限*/
mee.setAccessible(true);
Object objP =mee.invoke(claz.newInstance(), "byebye");
System.out.println(objP+"***"+"执行(私有)反射方法返回的结果");
/*
* 静态方法的获取是一样的思路;只是静态方法的调用第一个参数可以不用传方法所在的底层对象;注意的是私有方法调用前需要指定访问权限为true
*/
Class claz1=Class.forName("javaInvoke.test");
System.out.println(claz1+"全限定名class字节码对象获取方式");
Method sayNo = claz1.getMethod("sayNo", String.class);
System.out.println(sayNo+"获取sayNo静态方法对象");
Method sayYes = claz1.getDeclaredMethod("sayYes", String.class);
System.out.println(sayYes+"获取sayYes静态私有方法");
/**静态方法的调用**/
sayNo.invoke(null, "jane");
sayYes.setAccessible(true);
sayYes.invoke(null, "jim");
}