java反射机制方法的获取与调用

来源:互联网 发布:网络端口怎么接 编辑:程序博客网 时间:2024/06/01 07:19

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");


          
    }
   
0 0