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

用C语言做网站登录界面世界互联网峰会

用C语言做网站登录界面,世界互联网峰会,上海集团网站建设公司好,网络平台推广是干什么大家好,我是锋哥。今天分享关于【JDK动态代理和CGLIB动态代理的区别?】面试题。希望对大家有帮助; JDK动态代理和CGLIB动态代理的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JDK动态代理和CGLIB动态代理是Java中实现代理模式的两…

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

JDK动态代理和CGLIB动态代理的区别?

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

JDK动态代理和CGLIB动态代理是Java中实现代理模式的两种方式,它们的主要区别在于代理对象的生成方式和应用场景。以下是它们的具体区别:

1. 代理对象的生成方式

  • JDK动态代理

    • JDK动态代理是基于接口的代理,代理对象必须实现一个或多个接口。
    • 通过java.lang.reflect.Proxy类和InvocationHandler接口来创建代理对象。
    • 生成的代理对象是实现了接口的类。

    示例代码:

    public interface MyInterface {void doSomething();
    }public class MyInterfaceImpl implements MyInterface {public void doSomething() {System.out.println("Doing something!");}
    }public class MyInvocationHandler implements InvocationHandler {private Object target;public MyInvocationHandler(Object target) {this.target = target;}public 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 Main {public static void main(String[] args) {MyInterface target = new MyInterfaceImpl();MyInterface proxy = (MyInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new MyInvocationHandler(target));proxy.doSomething();}
    }
    

  • CGLIB动态代理

    • CGLIB(Code Generation Library)是基于类的代理,代理对象是通过继承目标类来实现的。
    • CGLIB使用字节码技术动态生成目标类的子类,并重写目标类的方法来创建代理对象。
    • 生成的代理类继承了目标类,因此不需要目标类实现接口。

    示例代码:

    public class MyClass {public void doSomething() {System.out.println("Doing something!");}
    }public class MyCglibProxy implements MethodInterceptor {private Object target;public MyCglibProxy(Object target) {this.target = target;}public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before method call");Object result = method.invoke(target, args);System.out.println("After method call");return result;}
    }public class Main {public static void main(String[] args) {MyClass target = new MyClass();Enhancer enhancer = new Enhancer();enhancer.setSuperclass(MyClass.class);enhancer.setCallback(new MyCglibProxy(target));MyClass proxy = (MyClass) enhancer.create();proxy.doSomething();}
    }
    

2. 是否依赖接口

  • JDK动态代理:必须依赖接口,目标类需要实现一个或多个接口。
  • CGLIB动态代理:不依赖接口,代理对象是通过继承目标类创建的,可以对普通类进行代理。

3. 性能差异

  • JDK动态代理:由于JDK动态代理依赖反射机制(Method.invoke()),在某些场景下性能较差,尤其是在方法调用频繁的情况下。
  • CGLIB动态代理:由于是通过继承目标类并重写方法来实现的,性能比JDK动态代理更高,但生成的代理类比较重,且需要使用字节码生成库(CGLIB),所以性能不如直接实现接口的JDK代理。

4. 生成的代理类的特点

  • JDK动态代理:生成的代理类实现了目标类的所有接口,代理类和目标类的实例是完全不同的对象。
  • CGLIB动态代理:生成的代理类是目标类的子类,代理类继承了目标类的方法,并重写了需要增强的方法。

5. 适用场景

  • JDK动态代理:适用于目标类实现了接口的情况。如果目标类没有实现接口,JDK动态代理不能使用。
  • CGLIB动态代理:适用于目标类没有接口的情况,或者你希望通过类继承的方式进行代理。但需要注意,CGLIB无法代理final类和final方法。

6. 代理对象的类型

  • JDK动态代理:生成的代理对象是接口类型的实例,实际调用会通过InvocationHandler来处理。
  • CGLIB动态代理:生成的代理对象是目标类的子类,代理对象是目标类的类型。

总结:

特性JDK动态代理CGLIB动态代理
代理方式基于接口的代理基于类的代理
是否需要接口需要接口不需要接口,使用类继承
性能相对较慢,使用反射更快,直接继承并重写方法
代理的对象类型代理类实现接口代理类是目标类的子类
适用场景目标类实现了接口的情况目标类没有接口或需要对类进行代理
final类的支持支持,final方法不可代理不支持,final类和final方法无法代理

选择使用JDK动态代理还是CGLIB动态代理,主要取决于你的应用场景。如果目标类已经实现了接口,且希望通过接口代理,JDK动态代理是更优选择;如果目标类没有接口,则需要使用CGLIB动态代理。

http://www.dtcms.com/wzjs/154648.html

相关文章:

  • 阿里云虚拟主机怎么建立网站百度小说排行榜前十名
  • dreamweaver 电商网站的制作网站关键词排名快速提升
  • 哪些企业网站做的好seo 页面链接优化
  • 电子商务网站建设方案案例合肥网站优化技术
  • 电商网站建设与开发课程试卷怎么在百度上推广自己
  • 网站建设增城东莞做网站公司电话
  • 税务局网站模板好看的seo网站
  • 设计灵感优化大师怎么删除学生
  • 郑州专业个人网站建设产品推广计划方案模板
  • 手机网站欣赏中美关系最新消息
  • sae wordpress伪静态seo关键词挖掘工具
  • 厦门做网站优化seo公司 彼亿营销
  • 毕业设计可以做网站不汽车网络营销推广方案
  • 网站设计毕业论文进度表范文找做网站的公司
  • 定制网站开发商业计划书重庆企业网站排名优化
  • 与电子商务网站建设有关实训报告培训网站排名
  • 珠海本地网站设计公司seo整站优化解决方案
  • 建站行业新闻推广软文
  • 做网站就业要会什么问题大众网疫情最新消息
  • 汽车网有哪些网站大全线上营销活动主要有哪些
  • 建立公众号seo专家是什么意思
  • 一级a做爰片偷拍免费网站百度收录是什么意思
  • 建设外包网站免费收录平台
  • 云安区学校网站建设统计表网站seo提升
  • 武汉建设网站制作seo课程培训要多少钱
  • 用dreamweaver做网站怎么切块平台推广是什么意思
  • 网站搭建代码大全临沂色度广告有限公司
  • 有必要自建网站做导购吗免费换友情链接
  • 顺德网站建设案例南宁网络推广平台
  • 自建站公司北京网站外包