当前位置: 首页 > news >正文

JDK的动态代理

今天给同事简单的演示了一下JDK的代理写法,在此也把代码贴出来,作为一个学习笔记。

动态代理的核心思想是不修改原有类和方法的基础上能添加一些功能,Spring的AOP是一个经典实现。好了,废话不多说,上代码。

第一段代码是一个接口,没什么好说的。

public interface Handler {

    public void handle();
}
下面一段代码是具体实现类,我们要代理的也是这个类,实现比较简单。
public class MyHandler implements Handler{

    public void handle(){
        System.out.println("myHandler................");
    }
}
下面代码是我们真正的核心,具体的Proxy类。这个类继承于InvocationHandler,只有一个方法,invoke方法。第一个参数我开始还以为是代理的具体类,就是我下面要引入的myHandler,后来发现其实是这个类本身。所以这个类在这里没有多大用处,第二个参数很好理解,具体代理类的代理方法,第三个就是参数了。代理类中传进具体的代理类myHandler。

public class ProxyHandler implements InvocationHandler{
    
    private MyHandler myHandler;
    
    public void setMyHandler(MyHandler myHandler) {
        this.myHandler = myHandler;
    }

    /* (non-Javadoc)
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        System.out.println("method:"+method.getName()+",proxy:"+method.getDeclaringClass().getName());
        method.invoke(myHandler, args);
        System.out.println("after");
        return null;
    }
}
开始写Client端代码了。

public class Client {

    public static void main(String[] args){
        MyHandler myHandler = new MyHandler();
        ProxyHandler ph = new ProxyHandler();
        ph.setMyHandler(myHandler);
        Handler proxy = (Handler) Proxy.newProxyInstance(Client.class.getClassLoader(), new Class<?>[]{Handler.class}, ph);
        proxy.handle();
    }
}
最后看看具体的输出。

before
method:handle,proxy:com.example.proxy.Handler
myHandler................
after




相关文章:

  • 实验一 Linux基本环境
  • 病毒原理实例
  • 利用jodconverter+openoffice+flexpaper实现的在线文档系统核心demo
  • 八数码编码(优化数据结构,优化算法)
  • mac 下 git svn 设置代理
  • 实时机票/火车票抓取系统整体架构
  • 我是伪程序员
  • asp.net实验一:hello world!
  • asp.net实验二:连接sql server 2008数据库
  • ASP.NET实验三:读取web.config连接数据库
  • 谷歌面试题(持续更新)
  • web前端实验一:利用Js捕获鼠标事件实现图片切换
  • web前端实验二:利用JS保护网页源代码
  • 五年专业编程的14个经验
  • 大数四则运算
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CSS3 变换
  • ES6系统学习----从Apollo Client看解构赋值
  • go语言学习初探(一)
  • JSDuck 与 AngularJS 融合技巧
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • 浏览器缓存机制分析
  • 前端学习笔记之观察者模式
  • 走向全栈之MongoDB的使用
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 带你开发类似Pokemon Go的AR游戏
  • 第二十章:异步和文件I/O.(二十三)
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (十一)手动添加用户和文件的特殊权限
  • (转)程序员疫苗:代码注入
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • @WebService和@WebMethod注解的用法
  • [383] 赎金信 js
  • [ABC294Ex] K-Coloring
  • [APUE]进程关系(下)
  • [AutoSar]BSW_Com02 PDU详解
  • [BT]BUUCTF刷题第9天(3.27)
  • [BUG]vscode插件live server无法自动打开浏览器
  • [DM复习]关联规则挖掘(下)
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件
  • [IE编程] 如何获得IE版本号
  • [JavaEE系列] Thread类的基本用法
  • [JavaWeb学习] tomcat简介、安装及项目部署
  • [Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解
  • [Linux]如何理解kernel、shell、bash
  • [loj#115] 无源汇有上下界可行流 网络流
  • [MAT]使用MAT比較多个heap dump文件
  • [MT8766][Android12] 取消WIFI热点超过10分钟没有连接自动关闭设定
  • [PHP源码阅读]empty和isset函数