热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单的方法拦截与ByteBuddy之前和之后

如何解决《简单的方法拦截与ByteBuddy之前和之后》经验,为你挑选了1个好方法。

在撰写本文时的Byte Buddy教程中,所有内容都得到了解释,但是一个简单的after和before方法拦截器不存在,正如我在下面解释的那样,我错过了什么或者教程很复杂.(请参阅LoggerInterceptor示例给出方法但不是对象,ChangingLoggerInterceptor示例给出对象但不调用方法)

我想要实现的是在setter方法执行后调用对象的方法.如何编写拦截器并在Java 6中使用它?

public class DirtyClass{

private String _sField;
private boolean _bDirty;

public void setField(String sField) {
    _sField = sField;
    //setDirty(true); to be appended after proxying
}
public String getField() {
    return _sField;
}
public void setDirty(boolean bDirty){
    _bDirty = bDirty;
}
public boolean isDirty(){
    return _bDirty;
}
}

DirtyClass d = new ByteBuddy().subclass(DirtyClass.class)...???

d.setField("dirty now");
System.out.println(d.isDirty()); //Expecting true

Rafael Winte.. 9

即使没有方法委派,您也可以实现这样的机制,如下所示:

DirtyClass d = new ByteBuddy()
  .subclass(DirtyClass.class)
  .method(isSetter().and(not(named("setDirty"))))
  .intercept(SuperMethodCall.INSTANCE.andThen(
      MethodCall.invoke(DirtyClass.class.getMethod("setDirty", boolean.class))
                .with(true)
  )).make()
  .load(DirtyClass.class.getClassLoader())
  .getLoaded()
  .newInstance();

这样,每个setter都被重写,首先调用它的super方法,然后以参数的形式调用该setDirty方法true.但是,评论中的链接示例也应该起作用.

拦截器可能如下所示(假设某些接口Dirtiable已实现):

public class Interceptor {
  public static void getter(@SuperCall Runnable zuper, @This Dirtiable self) {
    zuper.run();
    self.setDirty(true);
  }
}

这假设已检测的超类实现了Dirtiable可以使用.implement(Dirtiable.class)可以实现该方法的地方来完成的接口,以使用该实现来设置字段FieldAccessor.



1> Rafael Winte..:

即使没有方法委派,您也可以实现这样的机制,如下所示:

DirtyClass d = new ByteBuddy()
  .subclass(DirtyClass.class)
  .method(isSetter().and(not(named("setDirty"))))
  .intercept(SuperMethodCall.INSTANCE.andThen(
      MethodCall.invoke(DirtyClass.class.getMethod("setDirty", boolean.class))
                .with(true)
  )).make()
  .load(DirtyClass.class.getClassLoader())
  .getLoaded()
  .newInstance();

这样,每个setter都被重写,首先调用它的super方法,然后以参数的形式调用该setDirty方法true.但是,评论中的链接示例也应该起作用.

拦截器可能如下所示(假设某些接口Dirtiable已实现):

public class Interceptor {
  public static void getter(@SuperCall Runnable zuper, @This Dirtiable self) {
    zuper.run();
    self.setDirty(true);
  }
}

这假设已检测的超类实现了Dirtiable可以使用.implement(Dirtiable.class)可以实现该方法的地方来完成的接口,以使用该实现来设置字段FieldAccessor.


推荐阅读
  • 如何解决《何时何地在Java源代码中初始化/存储String?》经验,如何解决这个问题? ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 本题探讨如何编写程序来计算一个数值的整数次方,涉及多种情况的处理。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 如何解决《错误:代码太大》经验,求大佬解答? ... [详细]
author-avatar
米饭2502912051
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有