代理:代理基于反射机制。也就是说学代理前需要对反射机制有一定的了解。
代理模式的作用:
- 增强功能:在原有的功能上,增加了额外的功能,这一步骤称为增强功能
- 控制访问:因为代理类似于中间商,作为一个中间轴,他可让你与你需要访问的对象进行间接的访问。
什么是动态代理:在程序执行过程中,使用jdk反射机制,创建出代理类对象并动态指向代理目标类。
JDK动态代理的特点:
- 目标对象必须实现业务接口
- jdk动态代理对象不需要去实现业务接口
- jdk动态代理对象在程序运行前不存在,在程序运行时动态在内存中构建
- jdk动态代理能灵活的进行业务功能的切换
- 自定义类中的方法(非接口方法不能被代理)
也就是说:jdk动态代理必须要有接口,目标类必须实现接口,若没有接口,则需要采用cglib动态代理的方式。
jdk动态代理的实现步骤
1,编写目标接口
//假设接口中存在销售 sell方法
public interface UsbService {
float sell(int count);
}
2,自定义类去实现目标接口
//自定义类实现目标接口中方法的内容,方法体中写入执行功能
public class UsbServiceImpl implements UsbService {
@Override
public float sell(int count) {
System.out.println("调用开始");
return 85.0f*count;
}
}
3,自定义类去实现一个invocationhandler接口,后去重写里头的invoke方法
public class UsebHandler implements InvocationHandler {
//因为在要懂得调用的是哪个对象的方法,所以需要去声明变量去存储
private Object duixiang;
public UsebHandler(Object duixiang){
this.duixiang=duixiang;
}
/**
* @param proxy 代理对象
* @param method 对象中的方法
* @param args 对象方法中的参数
* @return Object
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//进行方法的调用
Object invoke = method.invoke(duixiang, args);
if(invoke!=null){
float price=(float) invoke;
//代理内容 price为目标对象价格上加上20
price+=20;
System.out.println("商家送你一朵小红花");
return price;
}
return invoke;
}
}
4,自定义去调用proxy对象中的newproxyinstance方法,拿其返回值转换为接口类型后调用该接口中的方法即可
public class CustomerController {
public static void main(String[] args) {
UsbService use=new UsbServiceImpl();
UsebHandler usebHandler = new UsebHandler(use);
/**
* 参数一:传入目标对象的类加载器
* 参数二:传入目标对象的实现接口
* 参数三:传入带有实现方法体的invocationhandler对象
*需要将proxy.newproxyintance返回值转换为接口,因为实际调
*用的方法在该接口中
*/
UsbService usbService=(UsbService) Proxy.newProxyInstance(use.getClass().getClassLoader(),
use.getClass().getInterfaces(),
usebHandler);
//其中该处的usbService.sell(2)分别对应handler接口中的的invoke参数
float sell = usbService.sell(2);
System.out.println("usb价格是---->>>"+sell);
System.out.println("调用结束");
}
}
以上内容均个人小白理解,如有误请多包涵
谢谢