国际商业网站,制作企业网站费用明细,网页设计师培训班大连,备案期间关网站吗理解动态代理
动态代理的核心在于代理对象的创建和方法调用是在运行时动态发生的#xff0c;而不是在编译时就已经确定的性能监控、事务管理、日志记录通常需要使用代理对象对目标对象的功能进行增强为什么JDK动态代理只能代理有接口的类#xff1f;
因为Proxy.newProxyIns…理解动态代理
动态代理的核心在于代理对象的创建和方法调用是在运行时动态发生的而不是在编译时就已经确定的性能监控、事务管理、日志记录通常需要使用代理对象对目标对象的功能进行增强为什么JDK动态代理只能代理有接口的类
因为Proxy.newProxyInstance方法需要传入被动态代理的接口类target.getClass().getInterfaces()之所以要传入接口而不能传入类因为JDK动态代理会在运行时生成一个代理类叫做$Proxy0这个代理类会继承java.lang.reflect.Proxy这个类同时还会去实现被代理类的接口在Java里面是不支持多继承的而每一个动态代理类都继承了一个Proxy所以就导致了JDK动态代理只能代理接口而不能代理实现类其实也可以进行实现类的代理但是代理接口的设计更符合业务场景因为实际的开发中都是面向接口来开发的所以基于接口来实现动态代理更符合业务场景
JDK动态代理
public interface Service {void doSomething();
}public class ServiceImpl implements Service {Overridepublic void doSomething() {System.out.println(Doing something);}
}import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** JDK动态代理示例*/
public class MyInvocationHandler implements InvocationHandler {// target在构造之后不会发生改变private final Object target;public MyInvocationHandler(Object target) {this.target target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(前置处理);Object object method.invoke(target, args);System.out.println(后置处理);return object;}// 调用此方法会返回一个实现了目标对象所有接口的代理对象这个代理对象会使用当前类作为InvocationHandlerpublic Object getProxy() {// 类加载器、接口数组、InvocationHandlerreturn Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);}}public static void main(String[] args) {// 创建真实的服务对象Service realService new ServiceImpl();// 创建 MyInvocationHandler 的实例并传入真实的服务对象MyInvocationHandler handler new MyInvocationHandler(realService);// 使用 MyInvocationHandler 创建代理对象Service proxy (Service) handler.getProxy();// 调用代理对象的方法proxy.doSomething();}CGlib动态代理
dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.2.5/version/dependencyimport net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;/*** 适用于没有实现任何接口的类* 需要引入cglib代码库* cglib增强器负责拦截方法调用并添加额外逻辑*/
public class CGlibProxy implements MethodInterceptor {public Object createProxy(Object target) {Enhancer enhancer new Enhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(this);return enhancer.create(); // 动态创建代理对象}Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(前置处理);Object result proxy.invokeSuper(obj, args); // 动态调用方法System.out.println(后置处理);return result;}
}public static void main(String[] args) {ServiceImpl service new ServiceImpl();CGlibProxy proxy new CGlibProxy();ServiceImpl proxyService (ServiceImpl) proxy.createProxy(service);proxyService.doSomething();}