国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

(Java)利用反射動態(tài)調(diào)用類成員

2019-11-18 10:44:08
字體:
供稿:網(wǎng)友

  使用反射來調(diào)用類的方法,需要使用java.lang.reflect.Method中的invoke方法,Object??invoke(Object obj, Object[] args),第一個參數(shù)是指需要調(diào)用的那個方法的隱式參數(shù),也即那個方法所屬的對象,假如調(diào)用的是一個靜態(tài)方法將第一個參數(shù)指定為null,第二個參數(shù)是指需要調(diào)用的那個方法的顯式參數(shù),因為一個方法可以有很多個參數(shù)所以在這里我們必須用一個數(shù)組來存放這些參數(shù),注重這個方法使用的是對象數(shù)組,在存放時盡管有值類型我們也要把相應(yīng)的包裝器類存放進(jìn)去,當(dāng)調(diào)用的這個方法有返回值,這在Java中是一個令人煩惱的問題,假如返回來的是一個對象還好,我們只需將invoke返回的Object強(qiáng)制轉(zhuǎn)換成特定的對象就可以,可是返回一個值類型呢?我們要使用就麻煩了,首先要對其解包裝,在用其包裝對象的方法返回普通值!我們編程思路很重要是吧!
  
  編程的基本思路:
  首先獲得需要被調(diào)用的方法的指針,其實說指針不是那么好理解,而java的方法指針也一度的引起很大的爭論,我們干脆叫引用吧!怎么獲的引用呢?可使用Class類的getMethod方法該方法返回一個Method,接著我們在使用Method的invoke方法調(diào)用這個引用所指向的方法,就這么簡單,我一直認(rèn)為用一個簡單的例子講訴一個復(fù)雜的概念是最注重實效的!(在JDK1.4下調(diào)試通過)
  
  import java.lang.reflect.*;
  
  public class InvokeMethods
  {
   public static void main(String[] args)
   {
          Employee emp = new Employee();
          
          ///getClass獲得emp對象所屬的類型的對象,Class就是類的類
          ///Class是專門用來描述類的類,比如描述某個類有那些字段,
          ///方法,構(gòu)造器等等!
          Class cl = emp.getClass();
          try
          {
            ///getMethod方法第一個參數(shù)指定一個需要調(diào)用的方法名稱
            ///這里是Employee類的setAge方法,第二個參數(shù)是需要調(diào)用
            ///方法的參數(shù)類型列表,是參數(shù)類型!如無參數(shù)可以指定null
            ///該方法返回一個方法對象
            Method sAge = cl.getMethod("setAge",
    new Class[] {int.class});
   
            Method gAge = cl.getMethod("getAge",null);
   
            Method pName = cl.getMethod("    new Class[] {String.class});
     
            /**
      *使用invoke調(diào)用指定的方法
      */
            Object[] args1 = { new Integer(25) };//參數(shù)列表
            //emp為隱式參數(shù)該方法不是靜態(tài)方法必須指定
            sAge.invoke(emp, args1);
   
            Integer AGE = (Integer)gAge.invoke(emp, null);
            int age = AGE.intValue();
            System.out.println("The Employee Age is: "+age);
   
            Object[] args3 = {new String("Jack") };
            pName.invoke(emp, args3);
          }
          catch(Exception e) {e.printStackTrace(); }
          System.exit(0);
   }
  
  }
  
  class Employee
  {
   //定義一個員工類
   public Employee()
   {
   age = 0;
   name = null;
   }
  
  //將要被調(diào)用的方法
   public void setAge(int a)
   {
   age = a;
   }
  
   //將要被調(diào)用的方法
   public int getAge()
   {
   return age;
   }
  
   //將要被調(diào)用的方法
   public void printName(String n)
   {
   name = n;
   System.out.println("The Employee Name is: "+name);
   }
  
   private int age;
   private String name;
  }

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 全椒县| 同江市| 雅安市| 万源市| 儋州市| 胶州市| 和静县| 嘉峪关市| 酒泉市| 陕西省| 上犹县| 陇南市| 新密市| 阳曲县| 福贡县| 宜昌市| 类乌齐县| 安图县| 海安县| 区。| 遂溪县| 信丰县| 治县。| 绥阳县| 延川县| 石城县| 馆陶县| 鹿邑县| 抚顺市| 兴城市| 宁南县| 桂林市| 山阴县| 茂名市| 古田县| 巴中市| 平安县| 南澳县| 清涧县| 安化县| 衡东县|