欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

使用Java反射的步驟是什么

本篇內(nèi)容介紹了“使用Java反射的步驟是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、重慶小程序開發(fā)公司、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了習水免費建站歡迎大家使用!

1、反射的概念

1、概念

反射,指在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法,對任意一個對象,都能調(diào)用它的任意一個方法。這種動態(tài)獲取信息,以及動態(tài)調(diào)用對象方法的功能,叫做java語言的反射機制。反射很強大,有優(yōu)點也有缺點。

優(yōu)點:靈活性高。因為反射屬于動態(tài)編譯,即只有到運行時才動態(tài)創(chuàng)建 &獲取對象實例。

缺點:執(zhí)行效率低。

2、獲取字節(jié)碼文件對象的方式

2.1 元數(shù)據(jù)的概念

元數(shù)據(jù)(metadata):元數(shù)據(jù)是指用來描述類的數(shù)據(jù),就是class的代碼數(shù)據(jù)。所有的class文件加載到虛擬機之后都會被構建成class對象,class對象描述了一個類都有哪些東西,大家都知道的實現(xiàn)的接口,繼承的抽象類,成員變量,類變量,成員方法,類方法,靜態(tài)方法等,這個class對象就是元數(shù)據(jù)。

Class類:代表一個類。

Field類:代表類的成員變量(成員變量也稱為類的屬性)。

Method類:代表類的方法。

Constructor類:代表類的構造方法。

使用Java反射的步驟是什么

編輯  搜圖

2.2 獲取class對象的方式

  • 2.2.1 通過對象獲得,因為任何對象都必須和class對象關聯(lián)

  • 2.2.2 通過類對象直接獲得

  • 2.2.3 通過類加載器獲得,因為類加載器讀取class文件會返回class對象

    即將用來反射的對象(隨便定義的一個對象,只是為了演示)

package org.pdool.reflect;

/**

* @author 香菜

*/

public class Npc {

  // 靜態(tài)field

  public static int NPC_TYPE_1 = 1;

  // 私有成員變量

  private int npcType;

  // 共有成員變量

  public String name;

  // 無參構造函數(shù)

  public Npc() {

  }

  // 有參構造函數(shù)

  public Npc(int npcType, String name) {

      this.npcType = npcType;

      this.name = name;

  }

  public int getNpcType() {

      return npcType;

  }

 public void setNpcType(int npcType) {

      this.npcType = npcType;

  }

  public String getName() {

      return name;

  }

  public void setName(String name) {

      this.name = name;

  }

  // 靜態(tài)方法

  public static void sayHello(String word){

      System.out.println("hello " + word);

  }

}

獲取反射class的三種方式

package org.pdool.reflect; 

/**

* @author 香菜

*/

public class ClazzTest {

   public static void main(String[] args) {

       //第一種方式獲取Class對象

       Npc npc1 = new Npc();//這一new 產(chǎn)生一個Npc對象,一個Class對象。

       Class npcClazz1 = npc1.getClass();//獲取Class對象

       System.out.println(npcClazz1.getName());

       //第二種方式獲取Class對象

       Class npcClazz2 = Npc.class;

       System.out.println(npcClazz1 == npcClazz2);//判斷第一種方式獲取的Class對象和第二種方式獲取的是否是同一個

       //第三種方式獲取Class對象

       try {

           Class npcClazz3 = Class.forName("org.pdool.reflect.Npc");//注意此字符串必須是真實路徑,就是帶包名的類路徑,包名.類名

           System.out.println(npcClazz3 == npcClazz2);//判斷三種方式是否獲取的是同一個Class對象

      } catch (ClassNotFoundException e) {

           e.printStackTrace();

      }

  }

}

3、反射如何獲取元數(shù)據(jù)并訪問

1、訪問權限

反射機制的默認行為受限于

Java的訪問控制,可通過 setAccessible 繞過控制。

// 設置對象數(shù)組可訪問標志

static void setAccessible(AccessibleObject[] array, boolean flag)  

2、獲取方法

使用Java反射的步驟是什么

編輯  搜圖

2.1 訪問靜態(tài)方法

public static void main(String[] args) throws NoSuchMethodException,InvocationTargetException, IllegalAccessException {

       Npc npc = new Npc(1, "妖神·凰女");

       Class npcClazz = Npc.class;

       // 第一個參數(shù)是方法名,第二個參數(shù)是函數(shù)的參數(shù)class對象,因為存在重載的可能性,用參數(shù)類型區(qū)分

       Method sayHello = npcClazz.getMethod("sayHello", String.class);

       sayHello.invoke(npc, "world");

  }

2.2 訪問類方法

      Npc npc = new Npc(1, "妖神·凰女");

      System.out.println(npc.getName());

      Class npcClazz = Npc.class;

      // 第一個參數(shù)是方法名,第二個參數(shù)是函數(shù)的參數(shù)class對象,因為存在重載的可能性,用參數(shù)類型區(qū)分

      Method sayHello = npcClazz.getMethod("setName", String.class);

      sayHello.invoke(npc, "world");

      System.out.println(npc.getName());

3、獲取字段,讀取字段的值

使用Java反射的步驟是什么

編輯  搜圖

       Npc npc = new Npc(1, "妖神·凰女");

       Class npcClazz = Npc.class;

       // 獲取字段,并設置可訪問

       Field field = npcClazz.getField("name");

       field.setAccessible(true);

       System.out.println( field.get(npc));

4、獲取實現(xiàn)的接口

使用Java反射的步驟是什么

編輯  搜圖

5、獲取構造函數(shù),創(chuàng)建實例

使用Java反射的步驟是什么

編輯  搜圖

    Class npcClazz = Npc.class;

             Constructor declaredConstructor = npcClazz.getDeclaredConstructor(int.class,String.class);

       Npc npc = (Npc) declaredConstructor.newInstance(1, "妖神");

       System.out.println(npc.getName());

6、獲取繼承的父類

      Class npcClazz = Npc.class;

      Class superclass = npcClazz.getSuperclass();

      System.out.println(superclass.getName());

7、獲取注解

Class npcClazz = Npc.class;

       Annotation[] annotations = npcClazz.getAnnotations();

// 運行時注解

       for (Annotation annotation : annotations) {

       System.out.println(annotation.getClass().getName());

      }

4、反射實例

獲取到元數(shù)據(jù)不是最終的目的,我們最終的目的是想在運行時去調(diào)用,訪問類。說了太多,還是舉個例子,大家都知道Spring的IOC,怎么實現(xiàn)的吶?

過程:

1、Spring 在項目啟動的時間通過讀取xml中配置的bean的路徑,

2、然后通過Class.forName 讀取class 到類加載器,

3、然后通過反射創(chuàng)建所有的bean實例并保存到容器中,啟動容器之后,

4、在項目中可以直接獲取bean對象。

我們來大概實現(xiàn)這一過程,因為xml的讀取比較麻煩,直接用property來代替了。大家體會一下思想就可以了。

package org.pdool.reflect; 

import java.io.IOException;

import java.io.InputStream;

import java.lang.annotation.Annotation;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.Map;

import java.util.Properties;

import java.util.Set; 

/**

* @author 香菜

*/

public class ClazzTest {

  public static void main(String[] args){

      try {

          Map<String,Object> container = new HashMap<>();

          //1.讀取配置

          InputStream in = ClazzTest.class.getResourceAsStream("/beans.properties");

          Properties property = new Properties();

          property.load(in);

          //2.反射創(chuàng)建對象

          Set<Object> keySet = property.keySet();

          for (Object key : keySet) {

              // 2.1 獲取類的全路徑

              String classStr = (String) property.get(key);

              // 2.2 加載class 到虛擬機

              Class<?> beanClazz = Class.forName(classStr);

              // 2.3 獲取缺省的構造函數(shù)

              Constructor<?> declaredConstructor = beanClazz.getDeclaredConstructor();

              // 2.4 創(chuàng)建實例

              Object o = declaredConstructor.newInstance();

              container.put((String) key,o);

          }

          // 3.獲取實例

          Npc npc = (Npc) container.get("npc");

          System.out.println(npc == null);

      } catch (Exception e) {

          e.printStackTrace();

      }

  }

}

5、總結

在使用Java反射機制時,主要步驟包括:

1.獲取 目標類型的Class對象

2.通過 Class 對象分別獲取Constructor類對象、Method類對象 或者 Field 類對象

3.通過 Constructor類對象、Method類對象 & Field類對象分別獲取類的構造函數(shù)、方法&屬性的具體信息,并進行后續(xù)操作。

“使用Java反射的步驟是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

標題名稱:使用Java反射的步驟是什么
鏈接URL:http://aaarwkj.com/article34/iijhpe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、微信小程序、用戶體驗網(wǎng)站導航、品牌網(wǎng)站制作、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
成人污视频网站在线观看| 国产在线拍揄自揄视频不卡99 | 国产精品中文字幕第一区 | 国产精品一级性生活片| 九色91成人在线视频| 這裏隻有无码人妻久久| 国产精品久久久久久老熟女| 在线观看青青草原免费| 我的农村中年激情熟妇| 日韩一区二区三精品| 久久久久久精品国产av| 自偷自拍在线免费观看| 久久亚洲一区二区三区乱码| 午夜激情毛片在线观看| 少妇高潮毛片免费看高潮| 亚洲一区二区三区不卡伦理| av在线成人国产精品欧美| 日日狠狠久久偷偷综合色| 国产中文字幕精品在线| 蜜臀av首页在线观看| 亚洲午夜一区二区不卡| 免费毛片一区二区三区| 亚洲av资源一区二区| 国产精品欧美久久久久无| 日韩欧美人妻一二三四区| 日本欧美一区中文字幕| 99热这里只有精品中文| 日本一道本不卡一区二区| 太爽了少妇高潮在线看片| 日韩在线视频不卡播放| 未满18周岁禁止观看视频| 日韩欧美亚洲视频另类| 国产高潮呻吟久久av| 最新天堂av资源在线观看| 国产区一区二区三在线播放| 亚洲老熟女老妇老女人| 国内揄拍国内精品对久久| 亚洲一区欧美日韩91| 日韩一级免费高清黄片| 国产在线精品不卡一区| 国产高清在线不卡一区|