动态代理
方法定义三要素:
1、返回值类型
2、方法名
3、参数列表
方法执行三要素:
1、方法参数
2、方法返回值
3、方法具体实现的业务逻辑
代理对象增强的方式:
1、增强参数列表
2、增强返回值
3、增强方法体执行逻辑
功能增强
package cn.itcast.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Desc TODO
* @Author wzx
* @Date 2020/11/15 17:20
*/
public class ProxyTest {
public static void main(String[] args) {
//1、创建真实对象
Lenovo lenovo = new Lenovo();
//2、动态代理增强lenovo对象
/**
* 三个参数:
* 1、类加载器:真实对象.getClass().getClassLoader()
* 2、接口数组:真实对象.getClass().getInterfaces()
* 3、处理器:new InvocationHandler()
*/
//转为接口类型(真实类对象和代理对象都实现了 SaleComputer)
SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
/**
* 代理逻辑编写的方法: 代理对象调用的所有方法都会都会触发该方法执行
* 增强代码的逻辑就在 invoke方法里面编写
* @param proxy 代理对象 其实就是指的 proxy_lenovo对象
* @param method 代理对象调用的方法,被封装为对象(重要 利用反射封装成Method对象)
* @param args 代理对象调用的方法时,传递的实际参数 被封装到Object[] args数组里面
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/* System.out.println("该方法执行了");
System.out.println(method.getName()); //sale
System.out.println(args[0]);//8000*/
//判断是否是sale方法
if (method.getName().equals("sale")) {
//1、增强参数
double money = (double) args[0];
money = money * 0.85;
//增强方法体执行逻辑
System.out.println("专车接你....");
//使用真实对象调用改方法
String obj = (String) method.invoke(lenovo, money);
System.out.println("免费送货....");
//2、增强返回值
return obj+"_鼠标垫";
} else {
Object obj = method.invoke(lenovo, args);
return obj;
}
}
});
//2、调用方法(使用代理对象调用方法) 不管调用什么方法 invoke方法都会被执行
//String computer = lenovo.sale(8000);
String computer = proxy_lenovo.sale(8000);
System.out.println(computer);
//proxy_lenovo.show(); 该方法也会自动调用invoke方法
}
}
输出:
专车接你…
花了6800.0元买了一台联想电脑…
免费送货…
联想电脑_鼠标垫