美文网首页
动态代理(一)

动态代理(一)

作者: springczg | 来源:发表于2020-06-19 14:19 被阅读0次

实现动态代理

1、接口:

public interface Person {

void rent();

}

2、

public class RentPersonimplements Person{

@Override

    public void rent() {

System.out.println("我要租房子:");

    }

}

3、

public class RentProxyimplements InvocationHandler {

private Objecttarget;

    public ObjectRentProxy (Object target){

this.target = target;

        Object instance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

        return instance;

    }

@Override

    public Objectinvoke(Object target, Method method, Object[] args)throws Throwable {

System.out.println("填写身份信息");

        Object invoke = method.invoke(this.target, args);

        System.out.println("签合同");

        return invoke;

    }

}

public class TestProxy{

public static void main(String[] args) {

Person o =(Person)new RentProxy().RentProxy(new RentPerson());

    o.rent();

   }

}

具体的原理,请编译生成的类$Proxy0 ,具体操作如下:

在测试类Main方法里面加入如下代码:

byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Person.class});

File file =new File("D:/$Proxy0.class");  // 生成位置和文件名称

FileOutputStream outputStream =new FileOutputStream(file);

outputStream.write(bytes);

outputStream.close();

将$Proxy0.class 文件用idea 反编译  获取如下代码:

从以上代码可以看到,有一个构造方法、4个普通方法和一个静态代码块;其中equals、toString、hashCode这三个方法是每个类均有的,是继承Object类的,其中有一个方法是我们自己写的接口里面的,rent();

public final void rent() {

   super.h.invoke(this, m3, (Object[])null);

}

this:当前对象;

m3是什么呢? 从以上的类可以看到时一个方法,即我们自己写的rent() 方法;

static{

m3 = Class.forName("com.travelsky.monitor.member.service.Person").getMethod("rent");

}

相关文章

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

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

  • Spring的AOP原理分析

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

  • 编程常用的设计模式

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

  • 设计模式之代理模式

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

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

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

  • Java 动态代理

    前言 关于动态代理 JDK动态代理 CGLIB动态代理 区别 java动态代理是利用反射机制生成一个实现代理接口的...

  • 轻量级框架之Spring动态代理(第四周)

    动态代理主要有两种方式: JDK动态代理(Proxy) CGLIB代理 一、JDK动态代理 使用动态代理的五大步骤...

  • 动态代理

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

  • 动态代理的两种方式

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

  • 不学无数——Java动态代理

    动态代理 1. 什么是动态代理 在上一章节中,我们讲的是代理其实都是静态代理,动态代理是在运行阶段动态的创建代理并...

网友评论

      本文标题:动态代理(一)

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