国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JAVA中反射機制和模塊化的深入講解

JAVA中反射機制和模塊化的深入講解

2021-12-22 13:06常威再打來福 Java教程

很多剛學Java反射的同學可能對反射技術一頭霧水,為什么要學習反射,學習反射有什么作用,下面這篇文章主要給大家介紹了關于JAVA中反射機制和模塊化的相關資料,需要的朋友可以參考下

一.類加載

1.1類加載描述

當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過類的加載,類的連接,類的初始化這三個步驟來對類進行初始化。如果不出現意外情況,JVM將會連續完成這三個步驟,所以有時也把這三個步驟統稱為類加載或者類初始化

1.2類的加載

- 就是指將class文件讀入內存,并為之創建一個 java.lang.Class 對象

- 任何類被使用時,系統都會為之建立一個 java.lang.Class 對象

1.3類的連接

- 驗證階段:用于檢驗被加載的類是否有正確的內部結構,并和其他類協調一致

- 準備階段:負責為類的類變量分配內存,并設置默認初始化值

- 解析階段:將類的二進制數據中的符號引用替換為直接引用

1.4類的初始化

1.4.1類初始化的作用

在該階段,主要就是對類變量進行初始化

1.4.2初始化步驟

- 假如類還未被加載和連接,則程序先加載并連接該類

- 假如該類的直接父類還未被初始化,則先初始化其直接父類

- 假如類中有初始化語句,則系統依次執行這些初始化語句

- 注意:在執行第2個步驟的時候,系統對直接父類的初始化步驟也遵循初始化步驟1-3

1.4.3類的初始化時機

- 創建類的實例

- 調用類的類方法

- 訪問類或者接口的類變量,或者為該類變量賦值

- 使用反射方式來強制創建某個類或接口對應的java.lang.Class對象

- 初始化某個類的子類

- 直接使用java.exe命令來運行某個主類

 

二.反射

2.1反射的概述

是指在運行時去獲取一個類的變量和方法信息。然后通過獲取到的信息來創建對象,調用方法的一種機制。由于這種動態性,可以極大的增強程序的靈活性,程序不用在編譯期就完成確定,在運行期仍然可以擴展

2.2獲取Class類對象的三種方式

- 類名.class屬性

- 對象名.getClass()方法

- Class.forName(全類名)方法

public class ReflectDemo {
  public static void main(String[] args) throws ClassNotFoundException {
      //使用類的class屬性來獲取該類對應的Class對象
      Class<Student> c1 = Student.class;
      System.out.println(c1);

      Class<Student> c2 = Student.class;
      System.out.println(c1 == c2);
      System.out.println("--------");

      //調用對象的getClass()方法,返回該對象所屬類對應的Class對象
      Student s = new Student();
      Class<? extends Student> c3 = s.getClass();
      System.out.println(c1 == c3);
      System.out.println("--------");

      //使用Class類中的靜態方法forName(String className)
      Class<?> c4 = Class.forName("com.itheima_02.Student");
      System.out.println(c1 == c4);
  }
}

2.3反射獲取構造方法

方法名 說明
Constructor<?>[] getConstructors() 返回所有公共構造方法對象的數組
Constructor<?>[] getDeclaredConstructors() 返回所有構造方法對象的數組
Constructor<T> getConstructor(Class<?>... parameterTypes) 返回單個公共構造方法對象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回單個構造方法對象
public class ReflectDemo01 {
  public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
      //獲取Class對象
      Class<?> c = Class.forName("com.itheima_02.Student");

      //Constructor<?>[] getConstructors() 返回一個包含 Constructor對象的數組, Constructor對象反映了由該 Class對象表示的類的所有公共構造函數
//        Constructor<?>[] cons = c.getConstructors();
      //Constructor<?>[] getDeclaredConstructors() 返回反映由該 Class對象表示的類聲明的所有構造函數的 Constructor對象的數組
      Constructor<?>[] cons = c.getDeclaredConstructors();
      for(Constructor con : cons) {
          System.out.println(con);
      }
      System.out.println("--------");

      //Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一個 Constructor對象,該對象反映由該 Class對象表示的類的指定公共構造函數
      //Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回一個 Constructor對象,該對象反映由此 Class對象表示的類或接口的指定構造函數
      //參數:你要獲取的構造方法的參數的個數和數據類型對應的字節碼文件對象

      Constructor<?> con = c.getConstructor();

      //Constructor提供了一個類的單個構造函數的信息和訪問權限
      //T newInstance(Object... initargs) 使用由此 Constructor對象表示的構造函數,使用指定的初始化參數來創建和初始化構造函數的聲明類的新實例
      Object obj = con.newInstance();
      System.out.println(obj);

//        Student s = new Student();
//        System.out.println(s);
  }
}

2.4反射獲取成員變量

方法名 說明
Field[] getFields() 返回所有公共成員變量對象的數組
Field[] getDeclaredFields() 返回所有成員變量對象的數組
Field getField(String name) 返回單個公共成員變量對象
Field getDeclaredField(String name) 返回單個成員變量對象
public class ReflectDemo01 {
  public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
      //獲取Class對象
      Class<?> c = Class.forName("com.itheima_02.Student");
      //Field[] getFields() 返回一個包含 Field對象的數組, Field對象反映由該 Class對象表示的類或接口的所有可訪問的公共字段
      //Field[] getDeclaredFields() 返回一個 Field對象的數組,反映了由該 Class對象表示的類或接口聲明的所有字段
//        Field[] fields = c.getFields();
      Field[] fields = c.getDeclaredFields();
      for(Field field : fields) {
          System.out.println(field);
      }
      System.out.println("--------");
      //Field getField(String name) 返回一個 Field對象,該對象反映由該 Class對象表示的類或接口的指定公共成員字段
      //Field getDeclaredField(String name) 返回一個 Field對象,該對象反映由該 Class對象表示的類或接口的指定聲明字段
      Field addressField = c.getField("address");
      //獲取無參構造方法創建對象
      Constructor<?> con = c.getConstructor();
      Object obj = con.newInstance();

//        obj.addressField = "西安";
      //Field提供有關類或接口的單個字段的信息和動態訪問
      //void set(Object obj, Object value) 將指定的對象參數中由此 Field對象表示的字段設置為指定的新值
      addressField.set(obj,"西安"); //給obj的成員變量addressField賦值為西安

      System.out.println(obj);



//        Student s = new Student();
//        s.address = "西安";
//        System.out.println(s);
  }
}

2.5反射獲取成員方法

方法名 說明
Method[] getMethods() 返回所有公共成員方法對象的數組,包括繼承的
Method[] getDeclaredMethods() 返回所有成員方法對象的數組,不包括繼承的
Method getMethod(String name, Class<?>... parameterTypes) 返回單個公共成員方法對象
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回單個成員方法對象
public class ReflectDemo01 {
  public static void main(String[] args) throws Exception {
      //獲取Class對象
      Class<?> c = Class.forName("com.itheima_02.Student");
      //Method[] getMethods() 返回一個包含 方法對象的數組, 方法對象反映由該 Class對象表示的類或接口的所有公共方法,包括由類或接口聲明的對象以及從超類和超級接口繼承的類
      //Method[] getDeclaredMethods() 返回一個包含 方法對象的數組, 方法對象反映由 Class對象表示的類或接口的所有聲明方法,包括public,protected,default(package)訪問和私有方法,但不包括繼承方法
//        Method[] methods = c.getMethods();
      Method[] methods = c.getDeclaredMethods();
      for(Method method : methods) {
          System.out.println(method);
      }
      System.out.println("--------");
      //Method getMethod(String name, Class<?>... parameterTypes) 返回一個 方法對象,該對象反映由該 Class對象表示的類或接口的指定公共成員方法
      //Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回一個 方法對象,它反映此表示的類或接口的指定聲明的方法 Class對象
      //public void method1()
      Method m = c.getMethod("method1");

      //獲取無參構造方法創建對象
      Constructor<?> con = c.getConstructor();
      Object obj = con.newInstance();
//        obj.m();
      //在類或接口上提供有關單一方法的信息和訪問權限
      //Object invoke(Object obj, Object... args) 在具有指定參數的指定對象上調用此 方法對象表示的基礎方法
      //Object:返回值類型
      //obj:調用方法的對象
      //args:方法需要的參數
      m.invoke(obj);
  }
}

2.6反射的案例

2.6.1反射練習之越過泛型檢查

案例需求

通過反射技術,向一個泛型為Integer的集合中添加一些字符串數據

代碼

public class ReflectTest01 {
  public static void main(String[] args) throws Exception {
      //創建集合
      ArrayList<Integer> array = new ArrayList<Integer>();

//        array.add(10);
//        array.add(20);
//        array.add("hello");
      Class<? extends ArrayList> c = array.getClass();
      Method m = c.getMethod("add", Object.class);

      m.invoke(array,"hello");
      m.invoke(array,"world");
      m.invoke(array,"java");

      System.out.println(array);
  }
}

2.6.2運行配置文件中指定類的指定方法

案例需求

通過反射運行配置文件中指定類的指定方法

代碼

public class ReflectTest02 {
  public static void main(String[] args) throws Exception {
      //加載數據
      Properties prop = new Properties();
      FileReader fr = new FileReader("myReflect\\class.txt");
      prop.load(fr);
      fr.close();
      /*
          className=com.itheima_06.Student
          methodName=study
       */
      String className = prop.getProperty("className");
      String methodName = prop.getProperty("methodName");

      //通過反射來使用
      Class<?> c = Class.forName(className);//com.itheima_06.Student

      Constructor<?> con = c.getConstructor();
      Object obj = con.newInstance();

      Method m = c.getMethod(methodName);//study
      m.invoke(obj);
  }
}

 

三.模塊化

3.1模塊化概述

Java語言隨著這些年的發展已經成為了一門影響深遠的編程語言,無數平臺,系統都采用Java語言編寫。但是,伴隨著發展,Java也越來越龐大,逐漸發展成為一門“臃腫” 的語言。而且,無論是運行一個大型的軟件系統,還是運行一個小的程序,即使程序只需要使用Java的部分核心功能, JVM也要加載整個JRE環境。 為了給Java“瘦身”,讓Java實現輕量化,Java 9正式的推出了模塊化系統。Java被拆分為N多個模塊,并允許Java程序可以根據需要選擇加載程序必須的Java模塊,這樣就可以讓Java以輕量化的方式來運行

其實,Java 7的時候已經提出了模塊化的概念,但由于其過于復雜,Java 7,Java 8都一直未能真正推出,直到Java 9才真正成熟起來。對于Java語言來說,模塊化系統是一次真正的自我革新,這種革新使得“古老而龐大”的Java語言重新煥發年輕的活力

??????????????3.2模塊化使用

1.在項目中創建兩個模塊。一個是myOne,一個是myTwo

2.在myOne模塊中創建以下包和以下類,并在類中添加方法

JAVA中反射機制和模塊化的深入講解

3.在myTwo模塊中創建以下包和以下類,并在類中創建對象并使用

JAVA中反射機制和模塊化的深入講解

4.在myOne模塊中src目錄下,創建module-info.java,并寫入以下內容

JAVA中反射機制和模塊化的深入講解

5.在myTwo模塊中src目錄下,創建module-info.java,并寫入以下內容

JAVA中反射機制和模塊化的深入講解

3.3模塊化的基本使用

1.在myOne模塊中新建一個包,提供一個接口和兩個實現類

JAVA中反射機制和模塊化的深入講解

2.在myOne模塊中修改module-info.java文件,添加以下內容

JAVA中反射機制和模塊化的深入講解

3.在myTwo模塊中新建一個測試類

JAVA中反射機制和模塊化的深入講解

4.在myTwo模塊中修改module-info.java文件,添加以下內容

JAVA中反射機制和模塊化的深入講解

 

總結

到此這篇關于JAVA中反射機制和模塊化的文章就介紹到這了,更多相關JAVA反射機制和模塊化內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/q1097528949/article/details/120127866

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
主站蜘蛛池模板: 国产一区二区三区精品久久久 | 中文字幕人成乱码在线观看 | 日本一区二区视频 | 国产美女福利在线 | 91精品国产乱码久久久久久 | 亚洲乱码国产乱码精品精的特点 | 亚洲综合二区 | 亚洲国产视频一区 | 中文字幕亚洲一区二区va在线 | a欧美| 欧美综合一区二区三区 | 在线视频中文字幕 | 欧洲精品久久久久69精品 | 亚洲精品久久久久久久久久久 | 欧美激情综合网 | 成人精品福利视频 | 日日操天天操 | 羞羞网站在线 | 久久免费精品 | 山岸逢花在线观看 | 日韩在线中文 | 国产电影一区二区三区图片 | 操操日| 91亚洲国产 | 福利视频在线播放 | 在线视频 中文字幕 | а天堂中文最新一区二区三区 | 国产亚洲一区二区精品 | 国产中文字幕一区 | 91精品国产乱码久久久久久 | 伊人久久国产 | 久久久久成人精品 | 国产精品一区二 | 欧美一性一交 | 欧美成人免费在线视频 | 成人精品三级av在线看 | www国产精品| 狠狠爱网站 | 亚洲va中文字幕 | 午夜免费 | 综合久久网 |