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);
    }
}

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