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:目标方法 @Override public void saleShaoBing() { System.out.println("卖烧饼..."); } @Override public void saleJianBing() { System.out.println("卖煎饼..."); } @Override public void saleYueBing() { System.out.println("卖月饼..."); } @Override public 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; } @Override public 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 { @Test public void test03() { WuDa wuDa = new WuDa(); WuDaInvocationHandler handler = new WuDaInvocationHandler(wuDa); System.out.println(wuDa.getClass()); //class com.atguigu.WuDa Arrays.stream(wuDa.getClass().getInterfaces()).forEach(System.out::println); //interface com.atguigu.ISale Object proxyInstance = Proxy.newProxyInstance(wuDa.getClass().getClassLoader(), wuDa.getClass().getInterfaces(), handler); ISale iSale = (ISale) proxyInstance; iSale.saleJianBing(); //送大麦茶... //卖煎饼... } @Test public 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()来动态生成代理类。动态代理可以极大地简化一些业务代码,比如日志记录,安全检查等等。