动态代理中被代理的对象的类必须要实现一个接口,不然代理不能用,且被代理的对象必须标记为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);
}
}