動態代理中被代理的對象的類必須要實現一個接口,不然代理不能用,且被代理的對象必須標記爲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);
}
}