动态代理
动态代理的基本实现
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
return null;
}
});
//2、调用方法(使用代理对象调用方法) 不管调用什么方法 invoke方法都会被执行
//String computer = lenovo.sale(8000);
String computer = proxy_lenovo.sale(8000);
System.out.println(computer);
//proxy_lenovo.show(); 该方法也会自动调用invoke方法
}
}