浅析java动态代理

作者: 聊聊其他 | 来源:发表于2019-11-01 18:08 被阅读0次
是什么

首先清楚代理是什么个什么东西。

顾明思议,代理即通过其他的方式去完成一件事。

生活中上网的时候,我们可能会去买东西,但是有时候不方便或者没空的时候,获取就会叫朋友帮忙去买。这时候我们也可以理解为代理。别人代替你去做一件事。

怎么做

在java中,代理分多种。这里讨论的是jdk中自带的方式,动态代理。这个在很多框架的实现中都会用到的技术。

关键类
public interface InvocationHandler {

    
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

顾名思义,Invokationhandler就是被代理对象的方法被invoke是的handle 逻辑所在

这个接口就是每个需要实现代理的功能核心所在

每次代理对象的目标方法被唤起的时候,都会调用这个invoke方法

我们来剖析一下这个方法的各个参数:

  • proxy:执行时,已经代理的对象。
  • Method: 被代理的方法
  • args:被代理的方法参数

通常在invoke方法中,很少去动proxy参数。主要是针对method 和 args 做动作。

怎么创建代理
Proxy.newProxyInstance(A.class.getClassLoader(), A.class.getInterfaces(), new LogInvocationHandler(objectToBeProxied));

使用Proxy.newProxyInstance去创建代理对象。主要的参数为第二个,和第三个。

第二个为代理需要实现的接口,可以多个。

第三个为实现的InvocationHandler, 通常handler 里面的实现,需要和被代理的对象进行绑定调用。因为通常要用到Method.invoke(targe,args) 方法。

创建代理之后,就可以使用代理调用相关的方法。

完整测试代码

下面是完成的测试代码,可以做相应的修改测试

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class TestProxy {


    public static interface SayHello {
        String hello();
    }

    public static class DefaultHello implements SayHello {

        @Override
        public String hello() {
            return "hello";
        }
    }


    static class LogInvocationHandler implements InvocationHandler {
        private Object target;

        public LogInvocationHandler(Object target) {
            this.target = target;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("make some log");
            return method.invoke(target, args);
        }
    }


    public static void main(String[] args) {
        SayHello defaultHello = new DefaultHello();
        SayHello hello = (SayHello) Proxy.newProxyInstance(DefaultHello.class.getClassLoader(), DefaultHello.class.getInterfaces(), new LogInvocationHandler(defaultHello));
        System.out.println(hello.hello());
    }

}

相关文章

  • 浅析java动态代理

    是什么 首先清楚代理是什么个什么东西。 顾明思议,代理即通过其他的方式去完成一件事。 生活中上网的时候,我们可能会...

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

  • Java的动态代理-浅析

    什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。 什么是动态代理? Java的j...

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • java基础巩固笔记(4)-代理

    标签: java Contents java基础巩固笔记(4)-代理概念动态代理创建动态类动态代理的工作原理面向切...

  • java 动态代理

    动态代理动态代理可以让我们在运行时动态生成代理类,解耦程度更高。Java 动态代理的实现主要借助于 java.la...

网友评论

    本文标题:浅析java动态代理

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