第28题Java代理有哪几种实现方式回答Java代理主要有两种实现方式静态代理和动态代理。其中动态代理又分为JDK动态代理和CGLIB动态代理。1. 静态代理定义静态代理是指在编码阶段就明确目标对象和代理对象的关系两者实现相同的接口或继承相同的父类。特点优点实现简单容易理解。能够在不修改目标对象的前提下通过代理对象扩展功能如日志记录、权限校验等。缺点如果接口增加方法目标对象和代理对象都需要同步维护代码冗余严重。代理类与目标类耦合度高灵活性差。代码示例以下代码展示了静态代理的基本实现interfaceService{voidexecute();}classTargetServiceimplementsService{Overridepublicvoidexecute(){System.out.println(目标对象执行业务逻辑);}}classStaticProxyimplementsService{privateServicetarget;publicStaticProxy(Servicetarget){this.targettarget;}Overridepublicvoidexecute(){System.out.println(代理对象前置处理);target.execute();System.out.println(代理对象后置处理);}}publicclassMain{publicstaticvoidmain(String[]args){ServicetargetnewTargetService();ServiceproxynewStaticProxy(target);proxy.execute();}}2. 动态代理定义动态代理是在程序运行时动态生成代理对象而不需要在编码阶段确定代理类与目标类的关系。分类JDK动态代理基于接口实现要求目标对象必须实现接口。CGLIB动态代理基于继承实现适用于没有实现接口的目标对象。代码示例JDK动态代理importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;interfaceService{voidexecute();}classTargetServiceimplementsService{Overridepublicvoidexecute(){System.out.println(目标对象执行业务逻辑);}}classDynamicProxyHandlerimplementsInvocationHandler{privateObjecttarget;publicDynamicProxyHandler(Objecttarget){this.targettarget;}OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println(代理对象前置处理);Objectresultmethod.invoke(target,args);System.out.println(代理对象后置处理);returnresult;}}publicclassMain{publicstaticvoidmain(String[]args){ServicetargetnewTargetService();Serviceproxy(Service)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),newDynamicProxyHandler(target));proxy.execute();}}CGLIB动态代理importorg.springframework.cglib.proxy.Enhancer;importorg.springframework.cglib.proxy.MethodInterceptor;importorg.springframework.cglib.proxy.MethodProxy;classTargetService{publicvoidexecute(){System.out.println(目标对象执行业务逻辑);}}classCglibProxyimplementsMethodInterceptor{OverridepublicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{System.out.println(代理对象前置处理);Objectresultproxy.invokeSuper(obj,args);System.out.println(代理对象后置处理);returnresult;}}publicclassMain{publicstaticvoidmain(String[]args){EnhancerenhancernewEnhancer();enhancer.setSuperclass(TargetService.class);enhancer.setCallback(newCglibProxy());TargetServiceproxy(TargetService)enhancer.create();proxy.execute();}}面试官视角面试官可能会问“JDK动态代理和CGLIB动态代理的区别是什么”答JDK动态代理基于接口实现要求目标对象必须实现接口CGLIB基于继承实现适用于没有实现接口的目标对象但无法代理final类或final方法。面试官可能会追问“Spring框架中如何选择使用哪种动态代理”答如果目标对象实现了接口优先使用JDK动态代理否则使用CGLIB动态代理。专栏大白话说Java面试题 — 01-Java基础篇