1、Java 反射技術
Java反射技術應用廣泛,它能夠配置:類的全限定名、方法和引數,完成物件的初始化,甚至是反射某些方法,這樣可以大大增強Java的可配置性,如Spring IoC 的基本原理也是反射,當然Spring IoC 的代碼要復炸得多,還有其他的技術結合,
Java 的反射內容繁多, 包括物件的構建、反射方法、注解、引數、介面等,這次主要講一下物件的構建和反射的方法,在Java中,反射是通過包java.lang.reflect.* 來實作的,
2、通過反射構建物件
在Java中允許通過反射配置資訊構造物件,
首先創建一個物件:
package com.hhh.learn.reflect;/** * 物件 * @author chao * */public class ReflectServiceImpl { private String name; //不帶參的構造方法 public ReflectServiceImpl(){} //帶參構造方法 public ReflectServiceImpl(String name){ this.name = name; } public void sayHello(String name){ System.out.println("Hello!" + name); } public void sayHello(){ System.out.println("Hello!" + name); }}
然后通過反射方法去構造這個物件,如下代碼:
//不帶參 public ReflectServiceImpl getInstance(){ ReflectServiceImpl object = null; try{ object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance(); }catch(Exception e){ e.printStackTrace(); } return object; }
這里的代碼就可以利用反射去構造了一個 ReflectServiceImpl 物件,其實利用反射方法構造物件就是給類加載器注冊了一個類的全限定名,再通過 newInstance() 的方法來初始化一個物件,
若要構造帶參的物件,可以查看以下代碼:
public ReflectServiceImpl getInstance2(){ ReflectServiceImpl object = null; try{ object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").getConstructor(String.class).newInstance("張三"); }catch(Exception e){ e.printStackTrace(); } return object; }
先通過 forName()的方法將類加載到加載器中,再通過 getConstructor()方法選擇哪一個構造方法,最后通過 newInstance() 的方法來初始化一個物件,
3、反射方法
再上面我們已經構造了物件,就可以呼叫他們的方法了,代碼如下:
ReflectServiceImpl object = null; try{ object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance(); Method method = object.getClass().getMethod("sayHello", String.class); method.invoke(object, "李四"); }catch(Exception e){ e.printStackTrace(); }
物件構造好,通過 getClass() 的方法獲取對應的物件, 再通過 getMethod()方法獲取對應的方法,里面填呼叫的方法名和引數的型別, 最后就呼叫 invoke() 方法執行對應的方法,里面要寫明物件和引數的值,通過這樣就可以利用反射的方式去呼叫方法了,
4、反射的優點和缺點
反射的優點:只要配置就可以生成物件,可以解除程式的耦合度,比較靈活,大大增強的可配置性和可擴展性,
反射的缺點:運行比較慢,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/37805.html
標籤:設計模式
上一篇:設計模式之?外觀模式
