java中的動態代理示例-基於接口的代理

動態代理中被代理的對象的類必須要實現一個接口,不然代理不能用,且被代理的對象必須標記爲final,

示例中三個文件 一個接口,一個接口的實現類,一個客戶端的模擬類,使用動態代理實現方法調用

//接口

public interface IProduct {
    String saleProduct(float money);
    String AfterSaleProduct(float money);
}
//實現類
public class ProductImpl implements IProduct {
    public String saleProduct(float money) {
        return "銷售電腦,收入"+money+"元";
    }
    public String AfterSaleProduct(float money) {
        return "售後維修,收入"+money+"元";
    }
}

//測試類

public class Client {
    public static void main(String[] args) {
        final IProduct product=new ProductImpl(); //這個對象必須是final
        //final IProduct product=new ProductImpl(); 可以使用接口也可以直接使用實現類但前提是類ProductImpl必須要實現一個接口,否則會報錯
        IProduct pro = (IProduct)Proxy.newProxyInstance(product.getClass().getClassLoader(), product.getClass().getInterfaces(), new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if("saleProduct".equals(method.getName())){
                    Float money=(Float)args[0];
                    return method.invoke(product,money*0.8f);
                }
                else{
                    return method.invoke(product,args);
                }
            }
        });
        String s = pro.saleProduct(1000f);
        System.out.println(s);

        String s1 = pro.AfterSaleProduct(20f);
        System.out.println(s1);
    }
}

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