日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【笔记】JAVA中的泛型和反射

發布時間:2024/9/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【笔记】JAVA中的泛型和反射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

泛型

Java的泛型是如何工作的?什么是類型擦除?
----泛型是通過類型擦除來實現的,編譯器在編譯時擦除了所有類型相關的信息,所以在運行時不存在任何類型相關的信息。例如List在運行時僅用一個List來表示。這樣做的目的是確保能和Java 5之前的版本開發二進制類庫兼容。無法在運行時訪問到類型參
數,因為編譯器已經把泛型類型轉換成了原始類型。
**泛型提供了編譯期的類型安全,確保只能把正確類型的對象放入集合中,**避免了在運行時出現ClassCastException。

利用泛型方法,還可以定義具有可變參數的方法,如printf()方法,具體格式如下:
System.out.printf("%d,%f\n",i,f);
System.out.printf(“x=%d,y=%d,z=%d”,x,y,z);
定義時“類型參數名”后面一定要加上“…”,表示是可變參數。“參數名”實際上是一個數組,當具有可變參數的方法被調用時,是將實際參數放到各個數組元素中。

public class test{ static <T> void print(T..ts) { //泛型方法,形參是可變參數 for(int i = 0;i < ts.length;i++) { System.out.PrintIn(ts[i]+" "); } } public static void main(String args[]){ String fruit[] = ["apple","pear","peach"]; print(fruit); }}

泛型接口:

interface test<T> { public T next(); }

在Java中,泛型增加了許多新的特性,其中最主要的有兩個:使用“::”對方法和構造方法進行引用,以及Lambda表達式的作用域。
方法與構造方法引用
Java中可以使用“::”傳遞方法或構造函數引用。

//創建接口。 public interface InterNew<String, Integer> { Integer InterNew(String string);} //創建引用靜態方法的類。 public class FuncNew { public static void main(String[] args){ //引用靜態方法valueOf() InterNew<String, Integer> in2 = Integer::valueOf; //使用valueOf()方法將字符串轉換為Integer類型 Integer i2 = in2.InterNew("25"); System.out.println("方法引用-String -> Integer:" + i2); } }

反射

在程序運行過程中,對于任意一個對象,都能夠知道這個對象所在類的所有屬性和方法,都能夠調用它的任意一個方法和訪問它的任意一個屬性,這種動態調用對象的方法及動態獲取信息的功能稱為Java語言的反射機制。
通過Java的反射機制,程序員可以方便、靈活地創建代碼,這些代碼可以在運行時進行裝配,在程序運行過程中可以動態地擴展程序。
Java的反射機制主要有以下功能:
·在運行時判斷任意一個對象所屬的類。
·在運行時構造任意一個類的對象。
·在運行時判斷任意一個類所具有的成員變量和方法。
·在運行時調用任意一個對象的方法。
·生成動態代理。
Java提供的反射所需要的類主要有java.lang.Class類和java.lang.reflect包中的Field類、Constructor類、Method類和Array類等。
·Class類的實例表示正在運行的Java應用程序中的類和接口。它是Java反射的基礎,對于任何一個類,首先要產生一個Class的對象,然后才可以通過Class類獲得其他的信息。
·Field類提供有關類或接口的單個字段的信息以及對它的動態訪問權限。反射的字段可能是一個類(靜態)字段或實例字段。該類封裝了反射類的屬性。
·Constructor類提供關于類的單個構造方法的信息以及對它的訪問權限。該類封裝了反射類的構造方法。
·Method類提供關于類或接口上單獨某個方法的信息,該方法可能是類方法或實例方法(包括抽象方法)。該類是用來封裝反射類的方法。
·Array類提供了動態創建和訪問Java數組的方法。它提供的方法都是靜態方法。

Class類
Java程序運行時,系統對所有對象賦予運行時類型標識,Class類是用來保存類型信息的類。Java虛擬機為每種類型管理著一個獨一無二的Class類。即Java虛擬機中會有一個Class對象,保存運行時的類和接口的類型信息。

獲取Class類對象

在Java語言中,獲取Class類對象的方式有3種,具體如下。
(1)通過Object類提供的getClass()方法獲得Class類對象。這是獲取Class類對象最常見的一種方式,具體格式如下:
Object obj = new Object(); //創建Object類對象
Class c1 = obj.getClass(); //調用Object類的getClass()方法獲取Class
(2)通過Class類的靜態方法forName()獲取字符串參數指定的Class類對象。具體格式如下:
Class c2 = Class.forName(“java.lang.Integer”);
(3)通過“類名.class”獲取該類的Class對象。具體格式如下:
Class c3= Integer.class;

c3:通過“類名.class”獲取的Class類對象。

生成對象

在Java程序中,通常使用new關鍵字調用類的構造方法來創建對象。但是,對于一些特殊情況,例如程序只有在運行時才知道要創建對象的類名,就需要使用Java的反射機制來創建對象。使用Java的反射機制創建對象有兩種方法,即無參構造方法和有參構造方法。
 無參構造方法
若使用無參數的構造方法創建對象,首先要獲得這個類的Class類對象,然后調用Class類對象的newInstance()方法。具體代碼如下:

Class c2 = Class.forName("java.lang.Integer"); //獲得Class類對象 c2.newInstance();

有參構造方法
若使用帶參數的構造方法創建對象的具體步驟如下:
(1)獲得指定類的Class類對象。
(2)通過反射獲取符合指定參數類型的構造方法類(Constructor類)對象。
(3)調用Constructor類對象的newInstance()方法傳入對應參數值,創建對象。

import java.lang.reflect.*; public class ClassObj { public static void main(String[] args){ //使用有參構造方法創建對象 try { //第一步,獲得指定類的Class類對象 Class c5 = Class.forName("java.lang.Integer"); //第二步,通過Class類對象獲得指定符合參數類型的構造方法 Constructor construct = c5.getConstructor(int.class); //第三步,通過Constructor類對象的newInstance()方法傳入參數,創建 Integer in = (Integer) construct.newInstance(1246); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }

總結

以上是生活随笔為你收集整理的【笔记】JAVA中的泛型和反射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。