当前位置: 首页 > 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/428637.html

相关文章:

  • 成都龙华小学网站建设百度app下载官方
  • 商务网站建设的优势优化设计电子课本
  • 亚马逊网站 如何做站内seo广州网页搜索排名提升
  • 3d建模软件有哪些安卓优化大师下载
  • 网站开发属于承揽合同吗google play下载官方版
  • 成都装修网站建设网站群发软件
  • 财务网站模板惠州seo优化
  • 网站构建的友情链接怎么做免费的网页入口
  • 建筑网站哪一个比较靠谱新品牌进入市场的推广方案
  • wordpress调取网盘cpu游戏优化加速软件
  • 网站建设明薇通网络价格美丽百度热搜大数据
  • 做网站需要申请专利吗老客外链
  • 临海做网站网络推广销售是做什么的
  • 怎么做才能提升网站收录怎么自己做网页
  • 网页前端开发流程石家庄关键词优化平台
  • 广州微网站开发维普网论文收录查询
  • 什么是网络营销的方法网站内链优化
  • 昌平网站建设公司广告推广赚钱在哪接
  • 好看的网站 你知道的2021关键词优化技巧
  • 我想做个旅游网站怎么做app软件开发
  • 专业做设计师品牌网站杭州seo推广优化公司
  • 什么网站做家具出口旅游景点推广软文
  • 包头网站 建设如何申请百度竞价排名
  • 住房城乡建设部 网站今日国际新闻大事件
  • 兰州网站优化网络推广的公司更可靠
  • premium wordpress pluginsgoogle 优化推广
  • 做建材去什么网站营销策划推广公司
  • 公司网站建设合同书外贸网站建设 google
  • 查公司的口碑和评价的网站网站排名优化教程
  • 菜鸟移动端网站开发网络营销软件下载