Java 方法的反射

言曌發表於2018-03-03

方法的反射

(1)如何獲取某個方法

方法的名稱和引數列表才能唯一確定某個方法

(2)方法反射放操作

method.invokw(物件,引數列表);

 

看下面這個 demo

  1. package practice.Reflect;
  2. import java.lang.reflect.Method;
  3. /**
  4.  * @Author: 言曌
  5.  * @Date: 2017/11/17
  6.  * @Time: 上午9:36
  7.  */
  8. public class MethodDemo1 {
  9.     public static void main(String args[]) {
  10.         //要獲取print(int,int)方法
  11.         //1、要獲取一個方法就是獲取類的資訊,要獲取類的資訊首先要獲取類的類型別
  12.         A a1 = new A();
  13.         Class c = a1.getClass();
  14.         /**
  15.          * 2、獲取方法  名稱和引數列表來決定
  16.          * getMethod()獲取的是public的方法
  17.          * getDelcaredMethod()自己宣告的方法
  18.          */
  19.         try {
  20.             //寫法一
  21. //            Method m = c.getMethod("print",new Class[]{int.class,int.class});
  22.             //寫法二
  23.             Method m = c.getMethod("print",int.class,int.class);
  24.             //之前的操作,非方法的反射
  25.             a1.print(10,20);
  26.             //方法的反射操作,和上面a1.print效果完全相同
  27.             //方法如果沒有返回值,返回null,有返回值返回具體的返回值
  28.             //寫法一
  29.             m.invoke(a1,new Object[]{10,20});
  30.             //寫法二
  31.             m.invoke(a1,10,20);
  32.             System.out.println("----------------------------");
  33.             //獲取方法print(String,String)
  34.             Method m1 = c.getMethod("print",String.class,String.class);
  35.             //用方法進行反射操作
  36.             m1.invoke(a1,"hello","world");
  37.             System.out.println("----------------------------");
  38.             //獲取方法print()
  39.             Method m2 = c.getMethod("print");
  40.             //用方法進行反射
  41.             m2.invoke(a1);
  42.         } catch (Exception e) {
  43.             e.printStackTrace();
  44.         }
  45.     }
  46. }
  47. class A {
  48.     public void print() {
  49.         System.out.println("Hello World");
  50.     }
  51.     public void print(int a,int b) {
  52.         System.out.println(a+b);
  53.     }
  54.     public void print(String a,String b) {
  55.         System.out.println(a.toUpperCase()+","+b.toLowerCase());
  56.     }
  57. }

 

在 A 類中有三個方法,同名但是引數不同。

平時我們要呼叫他們只需要

A a1 = new A();

a1.print(10,20);即可

現在我們通過反射的方式

先要獲取類的類型別,然後再獲取的其指定的方法

A a1 = new A();

Class c = obj.getClass();

Method m = c.getMethod("print",int.class,int.class);

m.invoke(a1);

通過反射的方式得到的結果和 a1.print() 方式是一樣的。


相關文章