JDK動態(tài)代理簡單實現(xiàn)

創(chuàng)建交通工具接口:Vehicle

package proxy;

public interface Vehicle {
    void drive();
} 

創(chuàng)建充電接口:Rechargable

package proxy;

public interface Rechargable {
    void recharge();
}

創(chuàng)建電動車實現(xiàn)類:ElectricCar

package proxy;

public class ElectricCar implements Rechargable, Vehicle {
  
    @Override  
    public void drive() {  
        System.out.println("電動車跑起來了!!!");
    }  
  
    @Override  
    public void recharge() {  
        System.out.println("電動車正在充電!!!");
    }  
  
}  

創(chuàng)建測試類:Test

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @ClassName Test
 * @Description TODO
 * @Date 2019/8/6 9:16
 * @Created by sunyiwei
 */
public class Test {
    public static void main(String[] args){
        ElectricCar car = new ElectricCar();
        // 1.獲取對應(yīng)的ClassLoader
        ClassLoader classLoader = car.getClass().getClassLoader();
        // 2.獲取ElectricCar 所實現(xiàn)的所有接口
        Class[] interfaces = car.getClass().getInterfaces();
        /*
          3.根據(jù)上面提供的信息,創(chuàng)建代理對象 在這個過程中,
                 a.JDK會通過根據(jù)傳入的參數(shù)信息動態(tài)地在內(nèi)存中創(chuàng)建和.class 文件等同的字節(jié)碼
                 b.然后根據(jù)相應(yīng)的字節(jié)碼轉(zhuǎn)換成對應(yīng)的class,
                 c.然后調(diào)用newInstance()創(chuàng)建實例
         */

        Object proxy = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("將要調(diào)用 " + method.getName() + " 方法!!!");
                method.invoke(car);
                System.out.println(method.getName() + " 調(diào)用完成!!!");
                return null;
            }
        });
        Vehicle vehicle = (Vehicle) proxy;
        vehicle.drive();
        Rechargable rechargable = (Rechargable) proxy;
        rechargable.recharge();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • https://blog.csdn.net/luanlouis/article/details/24589193 ...
    小陳阿飛閱讀 963評論 1 1
  • 比代理模式更強大的是我們只需要定義接口,用動態(tài)代理類當(dāng)做動態(tài)實現(xiàn)接口 mybatis mapper接口的實現(xiàn)htt...
    hehehehe閱讀 256評論 0 0
  • 最近常??吹揭恍┵Y料時,是不是會看到動態(tài)代理,但是在項目中卻好像沒怎么使用過動態(tài)代理,所以對動態(tài)代理的理解...
    Android開發(fā)_Hua閱讀 2,855評論 0 2
  • 給某個對象提供一個代理對象,并由代理對象控制對于原對象的訪問,即客戶不直接操控原對象,而是通過代理對象間接地操控原...
    米刀靈閱讀 196評論 0 0
  • 基礎(chǔ):class文件簡介及加載流程 Java編譯器編譯好Java文件之后,產(chǎn)生.class 文件在磁盤中。這種cl...
    jiangmo閱讀 507評論 0 1

友情鏈接更多精彩內(nèi)容