美文网首页JavaJava 杂谈
第一章1.3动态代理-cjlib

第一章1.3动态代理-cjlib

作者: yust5273 | 来源:发表于2019-06-07 16:08 被阅读0次

demo

//被代理类不需要实现接口(与jdk动态代理的区别)
public class YunZhongYu {
  public void findLove(){
      System.out.println("-------------");
  }
}
public class YustMeipo implements MethodInterceptor {
    //疑问:好像并没有持有被代理对象的引用,见下个方法的注释
    public Object getInstance(Class clazz) throws Exception{
        Enhancer enhancer = new Enhancer();
        //创建一个类,设置它的父类为我们的代理对象
        enhancer.setSuperclass(clazz);
        //这里把this传进去,是为了回调本对象的 intercept 方法,(25行下面那个方法)
        enhancer.setCallback(this);
        //1.生成源代码
        //2.编译成class文件
        //3.加载到JVM,并返回代理对象
        return enhancer.create();
    }
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("------------");
        //这个obj的引用是cglib给我们new出来的。
        //cglib new 出来以后的对象,是被代理对象的子类(继承了我们自己写的那个类
        // OOP:在new出子类之前,实际上默认调用了我们的super()方法的
        // ,new 了子类的同事,必须先new出父类,这就相当于间接的持有了我们的父类的引用
        //子类重写了父类的所有方法
        //我们改变了子类对象的某些属性,是可以间接的操作父类的属性的

        //这里调用父类的findLove方法,如果这里调用子类的findLove方法会造成死循环。
        //如果这里调用子类的findLove方法: 因为 obj是子类的引用。  test类中 obj.findLove();每次调用这个方法就会回调intercept方法,intercept方法中又调用自己,这就循环调用了。
        //如果这里调用父类的findLove方法:调用父类的findLove方法,就会执行我们父类中的 自己写的findLove方法,不会回调intercept方法。
        proxy.invokeSuper(obj, args);
        return null;
    }
}
public class YustTestFindLove {
    //JDK的动态代理是通过接口来进行强转的。
    //生成以后的代理对象,可以强转为接口

    //CGLib的动态代理是通过生成一个被代理对象的子类,然后重写父类方法,
    //生成以后的对象,可以强转为被代理对象(也就是自己写的类)
    //子类引用赋值给父类
    public static void main(String[] args){
        try {
            YunZhongYu obj = (YunZhongYu)new YustMeipo().getInstance(YunZhongYu.class);
            obj.findLove();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

相关文章

  • 第一章1.3动态代理-cjlib

    demo

  • 动态代理

    1 jdk代理 2 cjlib代理 pom

  • Java笔记之动态代理

    动态代理是JDK 1.3以上的版本里的一个特性,实现了代理模式。通过JDK的动态代理特性,可以为任意Java对象创...

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

  • 设计模式之代理模式

    代理分为静态代理和动态代理。 动态代理又包括基于JDK的动态代理、基于CGlib 的动态代理、基于Aspectj实...

  • Java高级主题(五)——动态代理

    代理可以分为静态代理、动态代理,动态代理又可以分为 jvm的动态代理 和 cglib的动态代理。像spring框架...

  • 动态代理

    动态代理分为两类:1、基于接口的动态代理; (JDK动态代理 )2、基于类的动态代理;(cglib动态代理)3、J...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

网友评论

    本文标题:第一章1.3动态代理-cjlib

    本文链接:https://www.haomeiwen.com/subject/cdzmxctx.html