java基於接口的動態代理

用到的類:Proxy(由jdk提供)

用到的方法:newProxyInstance()

實現接口的動態代理前提:被代理的類至少實現一個接口,如果沒有則不能使用接口的動態代理

/**
 * 對手機商要求的接口
 */
public interface IProducer {
    /**
     * 賣手機
     * @param money
     */
    public void saleProduct(float money);


    /**
     * 產品售後
     * @param money
     */
    public void afterService(float money);
}

 

/**
 * 生產者
 */
public class Producer implements IProducer {
    /**
     * 賣手機
     * @param money
     */
    public void saleProduct(float money){
        System.out.println("賣手機,拿到錢"+money);
    }
    /**
     * 產品售後
     * @param money
     */
    public void afterService(float money){
        System.out.println("產品售後,拿到錢"+money);
    }
}
public class Client {
    public static void main(String[] args) {
        final Producer producer = new Producer();
        /**
         * 基於接口的動態代理
         *   newProxyInstance方法的參數
         *      classLoader:類加載器
         *          它是用於加載代理對象字節碼的。
         *      class[]:字節碼數組
         *           它是用於讓代理對象和被代理對象有相同方法
         *      InvocationHandler:提供增強的代碼
         *      
         */
        IProducer proxyInstance =(IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
                producer.getClass().getInterfaces(),
                new InvocationHandler() {
                    /**
                     * 作用:執行被代理對象的任何接口方法都會經過該方法
                     * @param proxy 代理對象的引用
                     * @param method 當前執行的方法
                     * @param args 當前執行方法所需的參數
                     * @return     和被代理對象方法有相同的返回值
                     * @throws Throwable
                     */

                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                       //提供增強的代碼
                        Object returnValue=null;
                        //獲取方法執行的參數
                        Float money=(Float)args[0];
                        //判斷當前方法是不是銷售
                        if("saleProduct".equals(method.getName())){
                            returnValue=method.invoke(producer,money*0.8f);
                        }
                        return returnValue;
                        //return method.invoke(producer,args);
                    }
                });
        proxyInstance.saleProduct(5000f);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章