一个简单 JDK 动态代理的实例

摘要:
动态代理的步骤:创建一个实现InvocationHandler接口的类,并重写接口中的invoke()方法。

动态代理的步骤:

  1. 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法。
  2. 创建被代理的类和接口
  3. 通过 Proxy 的静态方法 newProxyInsatance(ClassLoader loader,Class[] interfaces,InvocationHandler,handler) 来创建一个代理
  4. 通过代理来调用方法

简单的动态代理实例

  1 package com.sean.zzzjvm;
  2 
  3 import java.lang.reflect.InvocationHandler;
  4 import java.lang.reflect.Method;
  5 import java.lang.reflect.Proxy;
  6 
  7 /** * * @Author Sean * @Date 2017/8/20 21:43. * @Version */
  8 public class DynamicProxyTest {
  9 
 10     // 定义一个接口
 11     interface IHello{
 12         void sayHello();
 13     }
 14 
 15     // 实现该接口的类
 16     static class Hello implements IHello{
 17 
 18         @Override
 19         public void sayHello() {
 20             System.out.println("hello world");
 21         }
 22     }
 23 
 24     // 创建一个动态代理类,实现 InvocationHandler 接口
 25     static class DynamicProxy implements InvocationHandler{
 26         Object originalObj;
 27 
 28         // 创建一个代理的方法,在 new DynamicProxy().bind(new Hello()); 执行
 29         Object bind (Object originalObj){
 30             this.originalObj = originalObj;
 31             // 返回一个代理对象
 32             return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(),
 33                     originalObj.getClass().getInterfaces(),this);
 34         }
 35 
 36         // 默认重写的方法,在 hello.sayHello() 执行
 37         @Override
 38         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 39             System.out.println("welcome");
 40             return method.invoke(originalObj,args);
 41         }
 42     }
 43 
 44     public static void main(String[] args){
 45         // IHello hello = new Hello();
 46         // 调用动态代理的方法
 47          IHello hello = (IHello) new DynamicProxy().bind(new Hello());
 48         hello.sayHello();
 49     }
 50 
 51 }

免责声明:文章转载自《一个简单 JDK 动态代理的实例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇用Python实现动态的切换桌面背景Python获取list中指定元素的索引下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序接口测试时appid为空如何解决

一、web接口测试和app/微信小程序接口测试的区别 web接口一般是通过浏览器访问,app接口是通过手机端访问的,所以他们header头部请求是不一样的,一样的就是User Agent这个参数。 web请求的header请求中的User Agent以谷歌为例: MAC:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_1...

UVM_COOKBOOK学习【DUT-Testbench Connections】

关注微信公众号摸鱼范式,后台回复COOKBOOK获取COOKBOOK原本和译本 PDF度盘链接 将testbench连接到DUT 概述 本节,我们主要讨论将UVM testbench连接到RTL DUT的问题。 UVM testbench对象不能直接连接到DUT信号来驱动或采样。driver和monitor组件对象与DUT之间的连接是通过一个或多个具有静态...

读设计模式之禅6大设计原则

单一职责原则:简称SRP,指有且仅有一个原因引起类的变更。在设计类的时候尽可能使类的接口简单、清晰,职责分明;而类则尽量做到只有一个原因引起变化。这里强调的是类的内在逻辑简洁性。 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。这里从继承角度讲多态的条件,子类必须实现父类的所有方法,并且子类可以进行扩展。注:子类在覆写父类的方法时输入参数可以...

支付宝即时到账交易接口C#接入方式的几个坑

1、在官方文档中 https://docs.open.alipay.com/62/104743 可以清楚看到input_charset前面没有要求加下横杠,可是请求示例是带着的。经过实验得知,这个必须要加,不然会返回支付宝正忙。 2、官方文档说:“MD5签名的商户需要将key的值拼接在字符串后面”这里因为没有给示例,造成很多人误以为是在拼接好的后面加&am...

API的理解

API(Application Programming Interface,应用程序编程接口:是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 通俗的讲API就是接口,就是通道,负责一个程序和其他软件的沟通,本质是预先定义的函数。 API通常是以Http的形式提供,它隐...

接口测试中抓包工具的使用

在被测接口并没有明确的接口文档给出时,我们需要借助抓包工具来帮助测试,利用抓包工具我们几乎可以获得接口文档中能给你的一切。常见的抓包工具有Charles和Fiddler, Fiddler只能用在Windows平台, 而Charles可用于Windows, Mac, IOS和Android多平台。下面就总结一下Charles的用法。 一、Web抓取   Ch...