java Proxy InvocationHandler 动态代理实现详解

  spring 两大思想,其一是IOC,其二就是AOP..而AOP的原理就是java 的动态代理机制。这里主要记录java 动态代理的实现及相关类的说明。

  java  动态代理机制依赖于InvocationHandler接口、Proxy类。这是java 实现动态代理必须用到的。

  一、InvocationHandler:该接口中只有一个方法 public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;

该方法的作用目标对象的方法会转发由InvocationHandle这个接口的invoke方法来调用

/**
     * invoke 是 InvocationHandler 接口的唯一方法
     * 当我们使用动态代理调用目标对象的方法时,     * 目标对象的方法会转发由InvocationHandle这个接口的invoke方法来调用
     * 参数  1、proxy   ==> 代理的目标对象
     *     2、method  ==> 目标对象要调用的方法
     *     3、args    ==> 目标对象要调用的方法的参数数据
     *
     */

    以下是源码对invoke方法的解释

/**
     * Processes a method invocation on a proxy instance and returns
     * the result.  This method will be invoked on an invocation handler
     * when a method is invoked on a proxy instance that it is
     * associated with.
*/

  二、Proxy:Proxy类的作用及时动态创建一个代理对象的类,Proxy提供了许多方式,用了最多的是newProxyInstance

/**
     *
     * @param target
     * @return
     *
     * Proxy.newProxyInstance(loader, interfaces, h) 说明:
     * Proxy类的作用及时动态创建一个代理对象的类,Proxy提供了许多方式,用了最多的是newProxyInstance
     * 参数  1、loader      ==> 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
     *     2、interfaces  ==> 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,
     *             如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
     *     3、h           ==> 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,
     *        会关联到哪一个InvocationHandler对象上
     *
     *
     */

以下是源码的解释

 /**
     * Returns an instance of a proxy class for the specified interfaces
     * that dispatches method invocations to the specified invocation
     * handler.
*/

  三、动态代理的实现

  1、创建布标对象的接口Hello.java

/**
 * java proxy InvocationHandler 动态代理公共接口
 *
 * @author dyf
 *
 */
public interface Hello {
    void sayHello();
    void run(String name,int count);
}

  2、创建代理类DynaProxy.java

package cn.dyf.proxy;

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

/**
 * java proxy InvocationHandler 实现公共接口代理对象
 * 动待代理对象需实现InvocationHandler接口,重新invoke方法
 * @author dyf
 *
 */
public class DynaProxy implements InvocationHandler{

    private Object target;

    /**
     *
     * @param target
     * @return
     *
     * Proxy.newProxyInstance(loader, interfaces, h) 说明:
     * Proxy类的作用及时动态创建一个代理对象的类,Proxy提供了许多方式,用了最多的是newProxyInstance
     * 参数  1、loader      ==> 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
     *     2、interfaces  ==> 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,
     *             如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
     *     3、h           ==> 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,
     *        会关联到哪一个InvocationHandler对象上
     *
     *
     */
    public Object bind(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),
                this.target.getClass().getInterfaces(), this);

    }

    /**
     * invoke 是 InvocationHandler 接口的唯一方法
     * 当我们使用动态代理调用目标对象的方法时,目标对象的方法会转发由InvocationHandle这个接口的invoke方法来调用
     * 参数  1、proxy   ==> 代理的目标对象
     *     2、method  ==> 目标对象要调用的方法
     *     3、args    ==> 目标对象要调用的方法的参数数据
     *
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        result = method.invoke(this.target, args);
        return result;
    }

}

  3、创建App测试类

package cn.dyf.proxy;

public class ProxyApp {
    public static void main(String[] args) {
//        new StaticProxy(new SjHello()).sayHello();
        Hello bind = (Hello)new DynaProxy().bind(new SjHello());
        bind.sayHello();
        bind.run("小明", 100);

    }
}

原文地址:https://www.cnblogs.com/dyfbk/p/11121135.html

时间: 2024-10-11 14:47:29

java Proxy InvocationHandler 动态代理实现详解的相关文章

好程序员Java教程Java动态代理机制详解

好程序员Java教程Java动态代理机制详解:在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler: 1InvocationHandler is the interface implemented by the invocation handle

java的动态代理机制详解

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于 Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是 java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Cla

[转载] java的动态代理机制详解

转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

作者:亦山 推荐:hh375的图书馆 class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的.具体class文件是怎样组织类信息的,可以参考 此博文:深入理解Java Class文件格式系列.或者

Java 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的.具体class文件是怎样组织类信息的,可以参考 此博文:深入理解Java Class文件格式系列.或者是Java虚拟机规范. 下面通过一段代

(转)java的动态代理机制详解

原文出自:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有

Java动态代理 深度详解

代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常简单易懂的例子向大家介绍动态代理的两种类型,接着重点介绍动态代理的两种实现方式(Java 动态代理和 CGLib 动态代理),最后深入剖析这两种实现方式的异同,最后说说动态代理在我们周边框架中的应用. 在开始之前,我们先假设这样一个场景:有一个蛋糕店,它们都是使用蛋糕机来做蛋糕的,而且不同种类的蛋糕

代理设计模式之静态代理与动态代理(超..)详解

在学习Spring框架的时候,有一个重要的思想就是AOP,面向切面编程,利用AOP的思想结合Spring的一些API可以实现核心业务与辅助业务的分离,即可以在执行核心业务时,将一些辅助的业务加进来,而辅助业务(如日志,权限控制等)一般是一些公共业务,这样就实现了两者的分离,使得核心业务的代码更加纯粹,而且辅助业务也能得到复用,这一篇笔记是当时学习spring的时候写的,使用springAPI以及自定义类 实现AOP的一个例子 ,.AOP底层就是通过动态代理来实现的,最近专门学习了一下代理模式,反

基于JDK的动态代理技术详解

虽然对于Spring的基本思想Aop是基于动态代理和CGlib这一点很早就有所认识,但是什么是动态代理却不甚清楚.为了对Spring加深理解,我觉得好好学习一下java的动态代理是非常有必要的. 静态代理 在学习动态代理之前我先花一点时间了解一下静态代理,从静态代理出发了解代理到底是怎么一回事,以及了解静态代理的局限性,进而明白为什么要发展及使用动态代理技术. 相信使用过Spring框架的同学都知道Spring利用Aop完成声明式事务管理以及其他的代理增强,也就是在方法执行前后加上一些譬如时间.