jdk动态代理实现

忘是亡心i 2022-04-23 09:56 286阅读 0赞

说jdk动态代理模式,先来说一下什么是代理模式,顾名思义,就是别人需要做的活让其他人代理做了。比较常见的是,我需要买火车票,我现在没有办法去火车站购买,找到离我最近的火车票代理点购买火车票。而jdk实现的代理模式实现起来比较简单,重写接口方法,但是业务模块需要实现接口才能使用jdk的代理模式。重写的接口之前还需要了解一个东西,那就是java的反射机制,这里不详细说反射机制。

JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的 业务实现类对象 以及 方法名 ,动态地创建了一个代理类的class文件并被字节码引擎执行,然后通过该代理类对象进行方法调用。我们需要做的,只需指定代理类的预处理、调用后操作即可。代理类需要重写接口
java.lang.reflect.InvocationHandler里面的invoke()方法。

1定义业务逻辑层接口

  1. public interface BuyFacade {
  2. public void addCustomer();
  3. }

2实现业务逻辑层类

  1. public class BuyFacadeImpl implements BuyFacade {
  2. @Override
  3. public void addCustomer() {
  4. System.out.println("添加一个新的用户。。。。");
  5. }
  6. }

3代理类

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. public class BuyProxy implements InvocationHandler {
  5. private Object trage;
  6. /**
  7. * 绑定业务对象并返回代理对象
  8. * @param trage
  9. * @return
  10. */
  11. public Object bind(Object trage) {
  12. this.trage = trage;//接收业务层的对象
  13. //通过反射机制,创建一个代理类对象实例并返回。用户进行方法调用时使用
  14. //创建代理对象时,需要传递该业务类的类加载器(用来获取业务实现类的元数据,在包装方法是调用真正的业务方法)、接口、handler实现类
  15. return Proxy.newProxyInstance(trage.getClass().getClassLoader(), trage.getClass().getInterfaces(), this);
  16. }
  17. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  18. System.out.println("执行方法之前---------");
  19. Object result = method.invoke(trage, args);
  20. System.out.println("执行方法之后---------");
  21. return result;
  22. }
  23. }

4测试方法

  1. public static void main(String[] args){
  2. BuyFacadeImpl buyFacadeImpl = new BuyFacadeImpl();
  3. BuyProxy buyProxy = new BuyProxy();
  4. BuyFacade buyFacade = (BuyFacade) buyProxy.bind(buyFacadeImpl);
  5. buyFacade.addCustomer();
  6. }

结果:
执行方法之前————-
添加一个新的用户。。。。
执行方法之后————-

发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JDK动态代理实现原理

    之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白。比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把

    相关 如何实现JDK动态代理

    代理模式: 代理模式给某个对象提供了一个代理对象,并由代理对象控制对原对象的引用。 代理分为静态代理和动态代理。 为何用代理? 不用代理时,在写实现接口类Use

    相关 jdk动态代理实现

    说jdk动态代理模式,先来说一下什么是代理模式,顾名思义,就是别人需要做的活让其他人代理做了。比较常见的是,我需要买火车票,我现在没有办法去火车站购买,找到离我最近的火车票代理