当前位置: 首页 > wzjs >正文

搜索网排名济南seo排名搜索

搜索网排名,济南seo排名搜索,聊城网站优化公司,相亲网站男人拉我做外汇大家好,我是锋哥。今天分享关于【JDK动态代理与CGLIB实现的区别?】面试题。希望对大家有帮助; JDK动态代理与CGLIB实现的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JDK动态代理和CGLIB是两种常见的Java代理技术。它们都能在运行…

大家好,我是锋哥。今天分享关于【JDK动态代理与CGLIB实现的区别?】面试题。希望对大家有帮助;

JDK动态代理与CGLIB实现的区别?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

JDK动态代理和CGLIB是两种常见的Java代理技术。它们都能在运行时生成代理类,但实现的方式有所不同,各自适用于不同的场景。下面是它们的主要区别:

1. 代理机制

  • JDK动态代理:

    • 基于接口实现代理。
    • 只能为实现了接口的类生成代理对象。
    • 使用 java.lang.reflect.Proxy 类和 InvocationHandler 接口来实现代理。
    • 生成的代理对象必须实现接口。
  • CGLIB代理:

    • 基于子类的继承关系来实现代理。
    • 可以为没有实现接口的类生成代理对象。
    • 使用 net.sf.cglib.proxy.Enhancer 类来生成代理类,通过继承被代理类来创建代理。
    • CGLIB 是通过字节码技术在运行时动态创建一个被代理类的子类。

2. 使用限制

  • JDK动态代理:

    • 只能代理实现了接口的类,无法代理没有实现接口的类。
    • 适合于接口驱动的设计模式,如服务层接口的代理。
  • CGLIB代理:

    • 可以代理没有实现接口的类。
    • 适用于那些没有接口的类或者是无法修改源代码的类(比如第三方类库)。
    • 不能代理 final 类和 final 方法,因为它是通过继承生成代理类的,而 final 类无法被继承。

3. 性能

  • JDK动态代理:

    • 由于是基于接口的代理,它的性能通常较差,因为每次调用代理方法时都要通过反射来调用目标方法。
  • CGLIB代理:

    • 性能相对较好,因为它是通过字节码技术生成代理类的,调用时没有JDK动态代理的反射开销。

4. 代理对象的类型

  • JDK动态代理:

    • 生成的代理对象实现了被代理对象所实现的接口。
    • 通过反射来调用目标对象的方法。
  • CGLIB代理:

    • 生成的代理对象是被代理类的子类。
    • 调用方法时,直接调用继承自父类的方法。

5. 代码示例

JDK动态代理:
import java.lang.reflect.*;interface Service {void performService();
}class ServiceImpl implements Service {public void performService() {System.out.println("Performing service...");}
}class ServiceInvocationHandler implements InvocationHandler {private final Object target;public ServiceInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method call...");Object result = method.invoke(target, args);System.out.println("After method call...");return result;}
}public class JDKProxyExample {public static void main(String[] args) {Service service = new ServiceImpl();Service proxy = (Service) Proxy.newProxyInstance(service.getClass().getClassLoader(),service.getClass().getInterfaces(),new ServiceInvocationHandler(service));proxy.performService();}
}
CGLIB代理:
import net.sf.cglib.proxy.*;class Service {public void performService() {System.out.println("Performing service...");}
}class ServiceMethodInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before method call...");Object result = proxy.invokeSuper(obj, args);System.out.println("After method call...");return result;}
}public class CGLIBProxyExample {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Service.class);enhancer.setCallback(new ServiceMethodInterceptor());Service serviceProxy = (Service) enhancer.create();serviceProxy.performService();}
}

6. 总结

  • JDK动态代理:适用于接口驱动的代理,只能代理实现了接口的类。
  • CGLIB代理:适用于没有实现接口的类,可以为普通类生成代理,但不能代理 final 类或 final 方法。

在实际开发中,如果被代理类实现了接口,通常首选 JDK 动态代理。如果被代理类没有实现接口,或者需要更高性能,可以使用 CGLIB 代理。


文章转载自:

http://bkFipEDd.trwkz.cn
http://ieVGhshR.trwkz.cn
http://PFA5gaJv.trwkz.cn
http://U5PohSos.trwkz.cn
http://izMyJc1H.trwkz.cn
http://OL3HlEi7.trwkz.cn
http://u9VtNqC1.trwkz.cn
http://GXqd6Rde.trwkz.cn
http://e5moS8pi.trwkz.cn
http://OemxilOd.trwkz.cn
http://LMcRoZFH.trwkz.cn
http://fMnEgJi2.trwkz.cn
http://tGRiJcfy.trwkz.cn
http://GwcHhOZC.trwkz.cn
http://3XLHsLgC.trwkz.cn
http://4mVuOHZe.trwkz.cn
http://4Eh4IGw5.trwkz.cn
http://7OlnR0vv.trwkz.cn
http://R2I9krOy.trwkz.cn
http://RYmmZ3eD.trwkz.cn
http://PubqO85P.trwkz.cn
http://vFM3UiRX.trwkz.cn
http://vKj6POGS.trwkz.cn
http://qqplGu9r.trwkz.cn
http://pQFLXIAh.trwkz.cn
http://XTIEGgbB.trwkz.cn
http://2Y6zgg9i.trwkz.cn
http://xgx97aHI.trwkz.cn
http://4EFgsbO0.trwkz.cn
http://GpWaIAXb.trwkz.cn
http://www.dtcms.com/wzjs/727020.html

相关文章:

  • 怎么用网站做文案萍乡网站建设行吗
  • 网站后台有些不显示苏州的网络企业
  • 租号网站怎么做的wordpress防恶意注册
  • 网站建设公司哪家好该如何选择张家界市建设网站
  • 双语教学示范课程建设项目网站中国设计网官网入口
  • 邯郸做商城网站的公司wordpress yoast seo
  • 江干建设局网站福建网站开发
  • 网页制作与网站建设作业刚刚邯郸发生大事了
  • 呼市网站设计公司wordpress右下角悬浮
  • 做服装店网站的素材下载网站软件免费安装
  • 机关网站内容建设wordpress-saas
  • 怎样做可以连接服务器的网站网站后台模板修改用什么软件
  • 视频解析网站是怎么做的wordpress怎么修改右上角的内容
  • 网站编程 外包类型郑州400建站网站建设
  • 淘宝客导购网站建设wordpress 动画模板
  • 建筑设计案例网站阿里巴巴网站导航栏怎么做
  • 迁安做网站做金属的网站
  • 有域名如何做网站开发一个app收费
  • 动易网站模板免费网站构思
  • 网站建设 xplogowordpress extra script
  • 广州镭拓科技网站建设公司东莞网络营销销售
  • 杭州网站设计公司有哪些Linux查找WordPress路径
  • 建设维护网站 未签订合同网站建设延期合同书
  • html5网站开发原理深圳手机报价网站
  • 银川做网站建设室内设计师多少钱一个月
  • 织梦搭建商城网站江苏省建设协会网站首页
  • 上海网站推广 优帮云沧州建网站
  • 17网站一起做网店好不好微网站的定义
  • 布吉做网站公司工艺品网站设计
  • 网站建设的3个阶段网站建设的er图怎么画