什麼是Java反射機制以及動態代理
阿新 • • 發佈:2019-02-09
反射機制定義
Java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法,對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。
反射機制獲取類的三種方式
1.類名.class
//通過類名.class獲取類資訊
Class c = Car.class;
//獲取類方法
Method[] methods = c.getMethods();
//列印方法名稱
for(Method method : methods){
System.out.println(method.getName());
}
2.通過物件的getClass()方法獲取
3.通過全類名獲取Class.forName()//建立物件例項 Car car = new Car(); //通過物件的getClass()方法獲取類資訊 Class c = car.getClass(); //獲取類的建構函式 Constructor[] con = c.getConstructors(); //列印建構函式的名稱 for(Constructor cc:con){ System.out.println(cc.getName()); }
//通過全類名Class.forName獲取類資訊
Class c = Class.forName("classDemo.Car");
//通過class中的netInstance()方法例項化Car物件
Car o = (Car)c.newInstance();
//呼叫car物件中的test()方法
o.test();
使用場景
跨網路的遠端平臺建立和執行物件的能力,即遠端方法呼叫(RMI) 逆向工程 基於註解實現的框架動態代理
代理:基本的設計模式之一,它是為了提供額外的或不同的操作,而插入的用來代替“實際”物件的物件。public interface objectDemo { public void doSomething(); } /** * 被代理實現類 * @author liumengxi * * 2017-12-31 */ public class objectDemoImpl implements objectDemo { @Override public void doSomething() { System.out.println("objectDemoImpl"); } } /** * 代理實現類 * @author liumengxi * * 2017-12-31 */ public class proxyObjectDemoImpl implements objectDemo { private objectDemoImpl dl; public proxyObjectDemoImpl(objectDemoImpl dl){ this.dl = dl; } @Override public void doSomething() { System.out.println("proxyObjectDemoImpl dosomething...."); dl.doSomething(); } } /** * 測試 * @author liumengxi * * 2017-12-31 */ public class proxyObjectMain { public static void consumer(objectDemo od){ od.doSomething(); } /** * @param args */ public static void main(String[] args) { //執行被代理類方法 consumer(new objectDemoImpl()); //執行代理類方法 consumer(new proxyObjectDemoImpl(new objectDemoImpl())); } }
動態代理:動態的建立代理並動態地處理對所代理方法的呼叫。在動態代理上所做的所有呼叫都會被重定向到單一的呼叫處理器上,它的工作是揭示呼叫的型別並確定相應的對策。
/**
* 動態代理
* @author liumengxi
*
* 2017-12-31
*/
public class DynamicProxyHandler implements InvocationHandler {
private Object proxid;
public DynamicProxyHandler(Object proxid){
this.proxid = proxid;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//mthod.invoke將請求轉發給被代理物件執行
return method.invoke(proxid, args);
}
}
/**
* 測試
* @author liumengxi
*
* 2017-12-31
*/
public class proxyObjectMain {
public static void consumer(objectDemo od){
od.doSomething();
}
/**
* @param args
*/
public static void main(String[] args) {
//執行被代理類方法
objectDemoImpl od = new objectDemoImpl();
consumer(od);
/**
* 建立動態代理
* Proxy.newProxyInstance()可以建立動態代理
* 以下為newProxyInstance引數
* objectDemo.class 類載入器
* new Class[]{objectDemo.class} 該代理實現的介面
* DynamicProxyHandler InvocationHandler介面的一個實現
*/
objectDemo o = (objectDemo) Proxy.newProxyInstance(objectDemo.class.getClassLoader(),
new Class[]{objectDemo.class}, new DynamicProxyHandler(od));
consumer(od);
}
}