Java反射技術應用普遍,它可以配置:類的全限定名、方法和參數,完成對象的初始化,甚至是反射某些方法。這樣能夠大大加強Java的可配置性,如Spring IoC 的基本原理也是反射,固然Spring IoC 的代碼要復炸得多,還有其餘的技術結合。java
Java 的反射內容繁多, 包括對象的構建、反射方法、註解、參數、接口等。此次主要講一下對象的構建和反射的方法。在Java中,反射是經過包java.lang.reflect.* 來實現的。this
在Java中容許經過反射配置信息構造對象。spa
首先建立一個對象:code
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() 的方法來初始化一個對象。blog
若要構造帶參的對象,能夠查看如下代碼:接口
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() 的方法來初始化一個對象。get
再上面咱們已經構造了對象,就能夠調用他們的方法了,代碼以下:io
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() 方法執行對應的方法,裏面要寫明對象和參數的值。經過這樣就能夠利用反射的方式去調用方法了。class
反射的優勢:只要配置就能夠生成對象,能夠解除程序的耦合度,比較靈活,大大加強的可配置性和可擴展性。
反射的缺點:運行比較慢。