增强对象的功能
SaleComputer.java:
public interface SaleComputer {
public String sale(double money);
public void show();
}
Lenovo.java:
public class Lenovo implements SaleComputer {
@Override
public String sale(double money) {
System.out.println("花了"+money+"元买了一台联想电脑");
return "联想电脑";
}
@Override
public void show() {
System.out.println("展示电脑");
}
}
ProxyTest.java
public class ProxyTest {
public static void main(String[] args) {
//创建真实对象
Lenovo lenovo = new Lenovo();
//动态代理增强lenovo对象
/*
三个参数:
1,类加载器:真实对象.getClass().getClassLoader()
2,接口数组:真实对象.getClass().getInterfaces()
3,处理器:new InvocationHandler()
*/
SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
/*
代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
参数:
1,proxy:代理对象
2,method:代理对象调用的方法,被封装成对象
3,args:代理对象调用的方法,传递的实际参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// System.out.println("该方法执行了");
// System.out.println(method.getName());
// System.out.println(args[0]);
//判段是否是sale方法
if (method.getName().equals("sale")) {
//增强参数
double money = (double) args[0];
money = money * 0.8;
System.out.println("专车接");
//使用真实对象代用该方法
String obj =(String) method.invoke(lenovo, money);
System.out.println("免费送货");
//增强返回值
return obj+"+鼠标垫";
}else {
//使用真实对象代用该方法
Object obj = method.invoke(lenovo, args);
return null;
}
}
});
//调用方法
String computer = proxy_lenovo.sale(8000);
System.out.println(computer);
// proxy_lenovo.show();
}
}