java的动态代理在接java的api上有说明,这里就不写了。我理解的代理:

  对特定接口中特定方法的功能进行扩展,这就是代理。代理是通过代理实例关联的调用处理程序对象调用方法。

下面通过一个例子看一下:

  接口:

public interface Num {
    void show();

    int getNum();

    int getProduct(int x);
}

  实现类:

public class MyNum implements Num {
    @Override
    public int getNum() {
        return 3;
    }

    @Override
    public int getProduct(int x) {
        return x;
    }

    @Override
    public void show() {
        System.out.println("底层方法打印数字99");
    }
}

先看一下Method中的invoke方法在api中是怎么描述的

  

  就是说调用处理程序对接口的实现类对象调用Method对象表示的底层方法。

  第一种实现代理的方式:

public class NumProxy {
    private Object num;

  //通过构造方法构造接口的实现类对象 public NumProxy(Object num) { this.num = num; } public Object getNumByProxy(){ Object numProxy = Proxy.newProxyInstance(num.getClass().getClassLoader(), new Class[]{Num.class}, new InvocationHandler() { /** * method: 对应于在代理实例上调用的接口方法的 Method 实例。我理解的就是被代理的真实方法实例 * args: 我理解的是真实方法的参数数组 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; System.out.println("在方法之前开始记录"); String methodName = method.getName(); if("getProduct".equals(methodName)){ obj = method.invoke(num, args); obj = (Integer) obj * 2; System.out.println("proxy: getProduct()结束"); } else if("show".equals(methodName)){ obj = method.invoke(num, args); System.out.println("proxy: show()结束"); } return obj; } }); return numProxy; } }

  第二种实现代理的方式:通过实现InvocationHandler接口

public class NumProxyImpl implements InvocationHandler {
  //这里我把接口类型具体化了, 没有写成Object private Num num; public NumProxyImpl(Num num){ this.num = num; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; String methodName = method.getName(); if("getProduct".equals(methodName)){ System.out.println("proxy: getProduct()开始"); obj = method.invoke(num, args); obj = (Integer) obj * 2; System.out.println("proxy: getProduct()结束"); }else if("show".equals(methodName)){ System.out.println("proxy: show()开始"); obj = method.invoke(num, args); System.out.println("proxy: show()结束"); } return obj; } }

  测试代码:

public class TestNum {
    public static void main(String[] args) {
    //两种方式一起测试 NumProxy np = new NumProxy(new MyNum()); Num numProxy = (Num) np.getNumByProxy(); int x = numProxy.getProduct(2); System.out.println(x); numProxy.show(); System.out.println("----------------"); NumProxyImpl npi = new NumProxyImpl(new MyNum()); Num numPro = (Num) Proxy.newProxyInstance(Num.class.getClassLoader(), new Class[]{Num.class}, npi); int n = numPro.getProduct(3); System.out.println(n); numPro.show(); } }

 控制台结果:

  

第二种方式有点小疑惑,不知道大家有没有,那就是并没有显示的调用NumProxyImpl中的invoke方法,可是却执行了,嗯嗯,这个自己下去看一下啊

不想麻烦的只需要记住就行了。

比如编码的处理就可以用到代理,下次写个例子。

java动态代理的2种实现方式的更多相关文章

  1. Java动态代理的两种实现方式:

    方式一:传统的代理 package cn.hc.domain; import java.lang.reflect.InvocationHandler; import java.lang.reflect ...

  2. 动态代理的两种实现方式(JDK/Cglib)

    =========================================== 原文链接: 动态代理的两种实现方式(JDK/Cglib) 转载请注明出处! ================== ...

  3. java动态代理的两种方法

    动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包,如cglib包,同时还 ...

  4. Java动态代理的两种实现方法

    注:文章转载自:https://blog.csdn.net/m0_38039437/article/details/77970633 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术, ...

  5. Java 动态代理原理图解 (附:2种实现方式详细对比)

    ​ 动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 ...

  6. Java 动态代理

    被代理的接口特点: 1. 不能有重复的接口,以避免动态代理类代码生成时的编译错误. 2. 这些接口对于类装载器必须可见,否则类装载器将无法链接它们,将会导致类定义失败. 3. 需被代理的所有非 pub ...

  7. 彻底理解JAVA动态代理

    代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 代理模式的结构如下图所示. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public ...

  8. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  9. [转]Java 动态代理机制分析及扩展

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

随机推荐

  1. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  2. 满堂红CIO邓劲翔:房屋中介突围

    人脸识别.客户关系管理进度监控.业务流程实时监控.网站访问人数及流量实时监控等实际企业应用场景淋漓尽致.羽羽如生的以大屏幕上图表形式展现在人们面前,如果你不去继续询问,你不会知道这是一家才刚刚在房地产 ...

  3. sqlServer去除字符串空格

    说起去除字符串首尾空格大家肯定第一个想到trim()函数,不过在sqlserver中是没有这个函数的,却而代之的是ltrim()和rtrim()两个函数.看到名字所有人都 知道做什么用的了,ltrim ...

  4. Linux网卡驱动安装、防火墙原理

    安装网卡驱动程序: 需要检查是否安装kernel依赖包: rpm –q kernel-devel #检查kernel依赖包是否安装 yum –y install kernel-devel 检查gcc和 ...

  5. 《月之猎人 (Moon Hunters)》主角设计

    原文链接 游戏开发人员,你们好! 我是 Kitfox Games 工作室的总监 Tanya,我们的工作室位于加拿大的蒙特利尔,拥有六名员工. 我们 3 月份发布了<月之猎人>游戏的桌面版, ...

  6. 智能头盔 "Livall携全球首款智能骑行头盔亮相CES"

    LIVALL是全球首创集音乐.通讯.智能灯光为一体的智能骑行头盔的研发者,日前Livall携旗下智能骑行头盔BH 100和BH 60参展CES 2017,这也是目前世全球首款智能骑行头盔类产品,同时亮 ...

  7. mono for android学习过程系列教程(2)

    接着上一讲继续开始写,今天介绍的是安卓的基本组成结构. 在大多数情况下,MONO FOR ANDROID的命名空间和Android的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...

  8. C#高级知识点&(ABP框架理论学习高级篇)——白金版

    前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...

  9. 如何使用yum 下载 一个 package ?如何使用 yum install package 但是保留 rpm 格式的 package ? 或者又 如何通过yum 中已经安装的package 导出它,即yum导出rpm?

    注意 RHEL5 和 RHEL6 的不同 How to use yum to download a package without installing it Solution Verified - ...

  10. H3C交换机 配置IP映射

    进入cmd 输入命令:telnet 192.168.x.x(交换机IP地址) 登陆后,更换用户"sys" 输入命令:dis cur(展示当前状态) 进入后按"空格&quo ...