1、ISale.java
package com.atguigu; public interface ISale {void saleShaoBing();void saleJianBing();void saleYueBing();void saleManTou(); }
2、WuDa.java
package com.atguigu;//Target:目标类、目标对象 public class WuDa implements ISale{//target method:目标方法@Overridepublic void saleShaoBing() {System.out.println("卖烧饼...");}@Overridepublic void saleJianBing() {System.out.println("卖煎饼...");}@Overridepublic void saleYueBing() {System.out.println("卖月饼...");}@Overridepublic void saleManTou() {System.out.println("卖馒头...");} }
3、WuDaInvocationHandler.java
package com.atguigu; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class WuDaInvocationHandler implements InvocationHandler {private Object target;public WuDaInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//method表示目标方法String methodName = method.getName(); //获取目标方法名称if (methodName.endsWith("Bing")) {song();}return method.invoke(target,args);}public void song() {System.out.println("送大麦茶...");} }
4、ProxyTest.java
package com.atguigu; import org.junit.jupiter.api.Test; import java.lang.reflect.Proxy; import java.util.Arrays; public class ProxyTest {@Testpublic void test03() {WuDa wuDa = new WuDa();WuDaInvocationHandler handler = new WuDaInvocationHandler(wuDa);System.out.println(wuDa.getClass()); //class com.atguigu.WuDaArrays.stream(wuDa.getClass().getInterfaces()).forEach(System.out::println); //interface com.atguigu.ISaleObject proxyInstance = Proxy.newProxyInstance(wuDa.getClass().getClassLoader(), wuDa.getClass().getInterfaces(), handler);ISale iSale = (ISale) proxyInstance;iSale.saleJianBing();//送大麦茶...//卖煎饼...}@Testpublic void test04() {WuDa wuDa = new WuDa();WuDaInvocationHandler handler = new WuDaInvocationHandler(wuDa);Object proxyInstance = Proxy.newProxyInstance(wuDa.getClass().getClassLoader(), wuDa.getClass().getInterfaces(), handler);ISale iSale = (ISale) proxyInstance;iSale.saleManTou();//卖馒头...}}
Java动态代理是指在运行期间动态地创建一个代理对象,该代理对象可以在调用目标方法前或后添加一些通用的逻辑处理,例如记录日志、安全控制等。而JDK动态代理是指利用Java内置的反射机制,在运行时期间动态生成代理类。具体来说,JDK动态代理会根据传入的接口定义、接口方法以及处理器对象(InvocationHandler)等信息来动态创建代理类,并将代理类与目标对象进行关联,从而实现对目标对象方法的拦截和增强。因为JDK动态代理是基于接口实现的,所以只能代理实现了接口的类。
Java动态代理是一种在运行时动态生成代理类的技术,使用动态代理可以在不修改原始类代码的情况下,为其添加额外的功能或者控制。JDK提供了一个Proxy类和一个InvocationHandler接口,通过这两个类可以实现动态代理。在使用时,需要先创建一个InvocationHandler对象来实现代理的具体逻辑,然后通过Proxy类的静态方法newProxyInstance()来动态生成代理类。动态代理可以极大地简化一些业务代码,比如日志记录,安全检查等等。