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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java 反射应用_java反射(二)--反射应用案例

發布時間:2024/10/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 反射应用_java反射(二)--反射应用案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.反射實例化對象

經過一系列的分析之后發現雖然可以獲取Class類的實例化對象,但是依然覺得這個對象的獲取意義不是很大,因此可以通過以下幾個案例去理解反射的核心意義

--反射實例化對象:獲取Class對象之后最大的意義并不是在于只是一個對象的實例化操作形式,更重要的是Class類中提供有一個對象的反射實例化方法,在JDK1.9之前的實例化:public T newInstance() throw InstantiationException,IllegalAccessException,該方法代替了new 關鍵字的使用,但是在JDK1.9之后則發生了變化:class.getDeclaredConstructor().newInstance();

--范例:通過newInstance()方法實例化對象

1 package反射.認識反射機制.entity;2

3 /**

4 *@author: S K Y5 *@version:0.0.16 */

7 public classPerson {8 public Person() { //任何情況下只要實例化對象則一定要調用類中的構造方法

9 System.out.println("Person對象實例化了");10 }11

12 @Override13 publicString toString() {14 return "我是一個好人";15 }16 }

1 public classDemo {2 public static void main(String[] args) throwsClassNotFoundException, IllegalAccessException, InstantiationException {3 Class> aClass = Class.forName("反射.認識反射機制.entity.Person");4 Object o = aClass.newInstance(); //實例化對象

5 System.out.println(o);6 }7 }

--運行結果

Person對象實例化了

我是一個好人

Process finished with exit code0

--現在通過反射實現的對象實例化處理,依然要調用類中的無參構造方法,其本質等價于new 關鍵字的使用,但是該方法在JDK1.9之后被替代了,因為默認的Class類中的newInstance()方法只能夠調用無參構造,所以很多的開發者認為其描述的不準確,于是將其變換了形式(后續會說明)

二.反射與工廠設計模式

如果要想進行對象的實例化處理除了可以使用關鍵字new 之外,還可以挺過反射機制來完成.那么思考一個問題:為什么要提供有一個反射的實例化?到底是使用關鍵字new還是使用反射進行對象實例化呢?

--如果想要更好的解決此類問題,最好的解釋方案就是通過工廠設計模式來解決.工廠設計模式的最大特點:客戶端的程序類不直接牽扯到對象的實例化管理,只與接口發生關聯,通過工廠了獲取接口的實例化對象,傳統的工廠設計模式:

1 interfaceMessage{2 public void send(); //消息發送

3 }4 class NetMessage implements Message{ //網絡消息實現類

5 @Override6 public voidsend() {7 System.out.println("發送網絡消息");8 }9 }10 public classFactoryDemo {11 public static voidmain(String[] args) {12 Message message = new NetMessage(); //如果直接實例化則一定會有耦合問題

13 }14 }

--在實際的開發中,接口的主要作用是為不同的層提供有一個操作的標準.但是此時如果直接將一個子類設置為接口實例化操作,那么一定會有耦合問題,所以使用了工廠設計模式來解決此問題.

--范例:傳統的工廠設計模式

1 interfaceMessage {2 public void send(); //消息發送

3 }4

5 class NetMessage implements Message { //網絡消息實現類

6 @Override7 public voidsend() {8 System.out.println("發送網絡消息");9 }10 }11

12 classFactory {13 privateFactory() {14 } //沒有產生實例化對象的意義

15

16 public staticMessage getInstance(String className) {17 if ("NetMessage".equals(className)) {18 return newNetMessage();19 }20 return null;21 }22 }23

24 public classFactoryDemo {25 public static voidmain(String[] args) {26 Message message = Factory.getInstance("NetMessage");27 message.send();28 }29 }

--此種工廠設計模式屬于靜態工廠設計模式,此時如果追加一個子類,那么工廠類就需要進行相應的修改(追加相應的判斷語句),否則無法獲得新的子類的實例化對象.工廠設模式最有效解決的是子類與客戶端的耦合問題,但是解決的核心思想是在于提供有一個工廠類作為過渡端,可是隨著項目的進行,Message接口可能會有更多的子類,而且隨著時間的推移,子類會越來越多,因此工廠類永遠都需要修改,并且永無停止之日.

--此時最好的解決方案就是不使用關鍵字new來完成對象的實例化,因為關鍵字new在使用的時候需要有一個明確的類存在.而newInstance()的方法只需要有一個明確表示類名稱的字符串即可應用:

1 interfaceMessage {2 public void send(); //消息發送

3 }4

5 class NetMessage implements Message { //網絡消息實現類

6 @Override7 public voidsend() {8 System.out.println("發送網絡消息");9 }10 }11

12 classFactory {13 privateFactory() {14 } //沒有產生實例化對象的意義

15

16 public static Message getInstance(String className) throwsException {17 return(Message) Class.forName(className).newInstance();18 }19 }20

21 public classFactoryDemo {22 public static void main(String[] args) throwsException {23 Message message = Factory.getInstance("反射.反射應用案例.NetMessage");24 message.send();25 }26 }

--此時如果對子類繼續進行擴充的話,是沒有必要修改工廠類的.利用反射機制實現的工廠設計模式,最大的優勢在于,對于接口的子類的擴充,將不再影響到工廠類的定義.但是現在依然需要進行思考,在實際的項目開發之中,有可能會存在大量的接口,并且這些接口可能都需要通過工廠類來實例化對象,所以此時的工廠設計模式不應該只為一個Message接口服務,而應該變為為所有的接口服務(使用泛型實現開發需求):

1 interfaceService {2 public voidservice();3 }4

5 class HouseService implementsService {6 @Override7 public voidservice() {8 System.out.println("為您的住房提供服務.");9 }10 }11

12 interfaceMessage {13 public void send(); //消息發送

14 }15

16 class NetMessage implements Message { //網絡消息實現類

17 @Override18 public voidsend() {19 System.out.println("發送網絡消息");20 }21 }22

23 classFactory {24 privateFactory() {25 } //沒有產生實例化對象的意義

26

27 /**

28 * 獲取接口實例化對象29 *30 *@paramclassName 接口的子類31 *@paramtClass 描述的是一個接口的類型32 *@return如果子類存在則返回指定接口33 *@throwsException34 */

35 public static T getInstance(String className, Class tClass) throwsException {36 returntClass.cast(Class.forName(className).newInstance());37 }38 }39

40 public classFactoryDemo {41 public static void main(String[] args) throwsException {42 Message message = Factory.getInstance("反射.反射應用案例.NetMessage",Message.class);43 message.send();44 Service instance = Factory.getInstance("反射.反射應用案例.HouseService", Service.class);45 instance.service();46 }47 }

--此時的工廠設計模式才是所謂的高可用的工廠設計模式,而這種操作的實現依賴的就是泛型.此時的工廠設計模式將不再受限于指定的接口,可以為所有的接口提供實例化對象.

三.反射與單例設計模式

單例設計模式的核心本質在于類內部的構造方法私有化,在類的內部產生實例化對象之后在外部通過static方法獲取到實例化對象進行類中的結構調用.單例設計模式一共有兩種,懶漢式和餓漢式(餓漢式的單例是不再本次的討論范圍之內的,主要討論懶漢式的單例)

--范例:觀察懶漢式單例的問題

1 classSingleton {2 private static Singleton instance = null;3

4 privateSingleton() {5 }6

7 public staticSingleton getInstance() {8 if (instance == null) {9 instance = newSingleton();10 }11 returninstance;12 }13

14 public voidprint() {15 System.out.println("單例模式加載");16 }17

18 }19

20 public classLazyLoadDemo {21 public static voidmain(String[] args) {22 Singleton singleton =Singleton.getInstance();23 singleton.print();24 }25 }

--此時我們的操作是在單線程的環境下運行的,如果使用多線程

1 classSingleton {2 private static Singleton instance = null;3

4 privateSingleton() {5 System.out.println(Thread.currentThread().getName() + " 實例化單例對象");6 }7

8 public staticSingleton getInstance() {9 if (instance == null) {10 instance = newSingleton();11 }12 returninstance;13 }14

15 public voidprint() {16 System.out.println("單例模式加載");17 }18

19 }20

21 public classLazyLoadDemo {22 public static voidmain(String[] args) {23 for (int i = 0; i < 3; i++) {24 new Thread(() ->{25 Singleton.getInstance();26 }, "[單例創建者" + (i + 1) + "]").start();27 }28 }29 }

--運行結果

[單例創建者1] 實例化單例對象

[單例創建者2] 實例化單例對象

[單例創建者3] 實例化單例對象

Process finished with exit code0

--單例設計模式最大的特點是在整體運行之中,只允許產生一個實例化對象,當有了若干實例化對象之后,那么就不是單例設計模式了,我們可以大致分析單例模式的運行流程如下:

1.判斷instance是否為空?

2.如果instance為空,實例化instance對象

3.返回當前的instance

--因此在多線程的設計中,每一個線程在執行步驟1的時候都會認為此時的對象為空,那么都會去創建這個對象的實例,這樣一來單例設計模式也就失去了意義,如果想要解決這類問題,關鍵的核心就在于要解決同步處理,而解決同步處理的核心就是使用synchronized關鍵字

1 classSingleton {2 private static Singleton instance = null;3

4 privateSingleton() {5 System.out.println(Thread.currentThread().getName() + " 實例化單例對象");6 }7

8 public static synchronizedSingleton getInstance() {9 if (instance == null) {10 instance = newSingleton();11 }12 returninstance;13 }14

15 public voidprint() {16 System.out.println("單例模式加載");17 }18

19 }20

21 public classLazyLoadDemo {22 public static voidmain(String[] args) {23 for (int i = 0; i < 3; i++) {24 new Thread(() ->{25 Singleton.getInstance();26 }, "[單例創建者" + (i + 1) + "]").start();27 }28 }29 }

--運行結果

[單例創建者1] 實例化單例對象

Process finished with exit code0

--此時卻是進行了同步處理,但是這個同步的代價卻是很大的,因為效率會降低.因為整體代碼中實際上只有一塊區域需要同步處理,那就是instance對象的實例化處理部分,在這樣的情況下同步加的未免顯得有些草率,更加合理的進行同步處理:

1 classSingleton {2 //在對象實例化的時候,應該立刻與主內存中的實例對象保持同步,而不應該存在副本

3 private static volatile Singleton instance = null;4

5 privateSingleton() {6 System.out.println(Thread.currentThread().getName() + " 實例化單例對象");7 }8

9 public staticSingleton getInstance() {10 synchronized (Singleton.class) { //static方法只能使用Singleton.class

11 if (instance == null) {12 instance = newSingleton();13 }14 }15 returninstance;16 }17

18 public voidprint() {19 System.out.println("單例模式加載");20 }21

22 }23

24 public classLazyLoadDemo {25 public static voidmain(String[] args) {26 for (int i = 0; i < 3; i++) {27 new Thread(() ->{28 Singleton.getInstance();29 }, "[單例創建者" + (i + 1) + "]").start();30 }31 }32 }

總結

以上是生活随笔為你收集整理的java 反射应用_java反射(二)--反射应用案例的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 曰女同女同中文字幕 | 一区二区三区高清在线 | 黄色特级大片 | 和漂亮岳做爰3中文字幕 | 日韩和一区二区 | 日韩av中文| 国产中文一区二区 | 色综合天天综合网国产成人网 | 亚洲国产成人va在线观看天堂 | 国产一区二区高清 | 哪里可以免费看毛片 | 日韩精品1区2区3区 欧美一本 | 欧美日韩精品一区二区三区视频播放 | 成人a级网站 | 天天干干天天 | 四虎在线免费观看视频 | 91黄在线看| 热热99| www.成人| 国产亚洲一区二区不卡 | 男男全肉变态重口高h | ,国产精品国产三级国产 | 大度亲吻原声视频在线观看 | 无码成人一区二区 | 国产人成无码视频在线观看 | 日日草天天干 | 720url在线观看免费版 | 成人精品一区二区三区视频 | 国产福利资源 | 中文字幕网伦射乱中文 | 天天爱天天插 | 亚洲一区二区激情 | 天堂网视频在线观看 | 成人免费高清在线播放 | 国产一区二区三区日韩 | jizz黄色片 | 狠狠干影院 | 亚洲在线视频 | 红桃视频成人在线 | 久久视频在线观看免费 | 福利国产片 | 91视频在线免费 | 夜夜夜网站| 精品久久国产 | 亚洲国产日韩欧美在线观看 | 青娱乐在线播放 | 涩涩屋污| 日韩精品偷拍 | 国产情侣一区二区三区 | 一本色道久久综合亚洲精品图片 | 黄色片在线观看视频 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 911美女片黄在线观看游戏 | 欧美亚洲三级 | 免费精品视频在线观看 | 黄色小视频在线免费观看 | 黄色网占 | 成人免费看av | 成人综合av | 日本电影成人 | 国产精品一区二区久久久 | 亚洲综合丁香 | 五月婷婷在线视频 | 亚洲一区精品视频 | 久久一级大片 | 精品一区三区 | 日韩网红少妇无码视频香港 | 久久66热这里只有精品 | 亚州一区二区 | 黄色一级大片免费看 | 美女视频在线免费观看 | 国产一卡二卡在线播放 | 95视频在线 | 99九九久久 | 少妇29p | 91私密视频 | 成人免费自拍视频 | 午夜免费大片 | 天天5g天天爽免费观看 | 99久久精品国产一区色 | 精品电影在线观看 | 懂色av一区二区在线播放 | 欧美一二级 | 日韩成人在线播放 | 欧日韩不卡视频 | 国产日| 亚洲啊v在线 | 福利视频不卡 | 亚洲影视一区二区 | 91欧美视频 | 久久精品国产77777蜜臀 | www.亚洲黄色| 福利小视频在线观看 | 波多野结衣不卡视频 | 中文字幕人妻一区 | 国产精品无码AV | 黄色国产在线观看 | 欧美性xxxxx极品少妇 | 国产亚洲欧洲 |