1. 程式人生 > >Java反射機制與工廠模式

Java反射機制與工廠模式

ati 發生 sna div 忽略 event 封裝 什麽是 可能

工廠模式屬於創建型模式,它提供了一種創建對象的最佳方式。

它的特點是:客戶端的程序類不直接牽扯到對象的實例化管理,只與接口發生關聯,通過工廠類獲取指定接口的實例化對象。

簡單工廠模式如下:

技術分享圖片
 1 interface Car {
 2     public void Name();
 3 }
 4 class Audi implements Car {
 5     public void Name() {
 6         System.out.println("Audi");
 7     }
 8 }
 9 class Factory{
10     private
Factory() {} 11 public static Car getInstance(String className) { 12 if("Audi".equalsIgnoreCase(className)) { 13 return new Audi(); 14 } 15 return null; 16 } 17 } 18 public class Test { 19 public static void main(String[] args) throws Exception {
20 Car audi = Factory.getInstance("Audi"); 21 audi.Name(); 22 } 23 }
簡單工廠模式

問題在於,可能會有很多的繼承接口的子類,那麽工廠類就要一直更新下去,很麻煩。這時候,就引入反射機制。

技術分享圖片
 1 package test;
 2 interface Car {
 3     public void Name();
 4 }
 5 class Audi implements Car {
 6     public void Name() {
 7         System.out.println("Audi");
8 } 9 } 10 class Factory { 11 private Factory() {} 12 public static Car getInstance(String className) { 13 Car instance = null; 14 try { 15 instance = (Car) Class.forName(className).getDeclaredConstructor().newInstance(); 16 } catch (Exception e) { 17 e.printStackTrace(); 18 } 19 return instance; 20 } 21 } 22 public class Test { 23 public static void main(String[] args) throws Exception { 24 Car msg = Factory.getInstance("test.Audi"); 25 msg.Name(); 26 } 27 }
工廠模式

關於反射
反射最大的作用之一就在於可以不在編譯時知道某個對象的類型,而在運行時通過提供完整的”包名+類名.class”得到。註意:不是在編譯時,而是在運行時。
功能:
•在運行時能判斷任意一個對象所屬的類。
•在運行時能構造任意一個類的對象。
•在運行時判斷任意一個類所具有的成員變量和方法。
•在運行時調用任意一個對象的方法。
說大白話就是,利用Java反射機制我們可以加載一個運行時才得知名稱的class,獲悉其構造方法,並生成其對象實體,能對其fields設值並喚起其methods。
應用場景:
反射技術常用在各類通用框架開發中。因為為了保證框架的通用性,需要根據配置文件加載不同的對象或類,並調用不同的方法,這個時候就會用到反射——運行時動態加載需要加載的對象。
特點:
由於反射會額外消耗一定的系統資源,因此如果不需要動態地創建一個對象,那麽就不需要用反射。另外,反射調用方法時可以忽略權限檢查,因此可能會破壞封裝性而導致安全問題。

最後,如果接口也特別多的話,工廠類裏還是要寫很多個方法,這個問題可以用泛型解決,這樣的工廠模式叫抽象工廠模式

技術分享圖片
 1 package test;
 2 interface Car {
 3     public void Name();
 4 }
 5 class Audi implements Car {
 6     public void Name() {
 7         System.out.println("Audi");
 8     }
 9 }
10 interface Phone{
11     public void Name();
12 }
13 class iPhone implements Phone{
14     public void Name() {
15         System.out.println("iPhone");
16     }
17 }
18 class Factory {
19     private Factory() {}
20 
21     @SuppressWarnings("unchecked")
22     //instanceName 接口的子類   className接口的類型
23     public static <T> T getInstance(String instanceName, Class<T> className ) {
24         T instance = null;
25         try {
26             instance = (T) Class.forName(instanceName).getDeclaredConstructor().newInstance();
27         } catch (Exception e) {
28             e.printStackTrace();
29         }
30         return instance;
31     }
32 }
33 public class Test {
34     public static void main(String[] args) throws Exception {
35         Car audi = Factory.getInstance("test.Audi", Car.class);
36         audi.Name();
37         iPhone iphonex = Factory.getInstance("test.iPhone", iPhone.class);
38         iphonex.Name();
39     }
40 }
抽象工廠模式

面試題:什麽是java反射機制?

反射機制是 Java 語言提供的一種基礎功能,賦予程序在時自省(introspect,官方用語)的能力。通過反射我們可以直接操作類或者對象,比如獲取某個

對象的類定義,獲取類聲明的屬性和方法,調用方法或者構造對象,甚至可以運行時修改類定義。

Java反射機制與工廠模式