如何拦截具有标准 java 功能(无 AspectJ 等)的方法调用?

2023-11-26

我想拦截对某个类 MyClass 的所有方法调用,以便能够对某些 setter 调用做出反应。

我尝试使用动态代理,但据我所知,这只适用于实现某些接口的类。但MyClass没有这样的接口。

除了实现包装类之外,是否还有其他方法将所有调用委托给成员(该成员是 MyClass 的实例或除了使用 AOP 之外)?


正如您所注意到的,您不能使用 JDK 动态代理(无接口),但可以使用Spring和 CGLIB(Spring 附带的 JAR),您可以执行以下操作:

public class Foo
{
    public void setBar()
    {
        throw new UnsupportedOperationException("should not go here");
    }

    public void redirected()
    {
        System.out.println("Yiha");
    }
}

Foo foo = new Foo();
ProxyFactory pf = new ProxyFactory(foo);

pf.addAdvice(new MethodInterceptor()
{
    public Object invoke(MethodInvocation mi) throws Throwable
    {
        if (mi.getMethod().getName().startsWith("set"))
        {
            Method redirect = mi.getThis().getClass().getMethod("redirected");
            redirect.invoke(mi.getThis());
        }
        return null;
    }
});

Foo proxy = (Foo) pf.getProxy();
proxy.setBar(); // prints "Yiha"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何拦截具有标准 java 功能(无 AspectJ 等)的方法调用? 的相关文章

随机推荐

  • 如何更改 WCF 中的 SOAP 信封架构?

    我正在通过 WCF 连接到第三方端点 但遇到一个问题 WCF 生成的 SOAP 信封架构与端点不兼容 目前 WCF 正在生成
  • 滚动到特定 div

    我有几个divs posts其中有一个attr data id这对应于mysql DB id div class posts div div class posts div 现在如果我想滚动到特定的div只有我知道data id 我将如何滚
  • RX Observable.TakeWhile 检查每个元素之前的条件,但我需要在之后执行检查

    Observable TakeWhile 允许您在条件为真时运行序列 使用委托 以便我们可以对实际序列对象执行计算 但它会在每个元素之前检查此条件 如何在每个元素之后执行相同的检查 下面的代码演示了这个问题 void RunIt List
  • 将字符集转换为 nfa/dfa 的高效算法

    我目前正在研究扫描仪生成器 发电机已经工作正常 但是当使用字符类时 算法会变得非常慢 扫描仪生成器生成 UTF8 编码文件的扫描仪 应支持完整范围的字符 0x000000 到 0x10ffff 如果我使用大字符集 例如任何运算符 或 uni
  • iframe 内容在 Firefox 上消失

    我正在用基本的 HTML 填充一个空的 iframe 使用 iframe contents find body html contentBody See http jsfiddle net UjT2b 2 这在 Chrome 上效果很好 在
  • Mapbox gl js - 重叠图层和鼠标事件处理

    是否有任何清晰可靠 和描述 的机制来控制 Mapbox GL JS 中重叠图层的鼠标事件 例如 我有 3 个重叠的层 但希望仅对顶部的层调用单击处理程序 而不是对所有 3 个层调用 这是否可能 目前 作为解决方法 我跟踪 MouseEnte
  • Jpgraph 不会改变我的条形图上的颜色

    我刚刚开始使用 jpgraph 和 XAMPP 我想制作一个条形图 当我在网上阅读一些文章时 它说您可以传递一系列颜色来设置填充颜色 以便每个条形都具有不同的颜色 然而 每当我传递它的颜色时 图表都不会改变其默认的浅蓝色颜色 图表响应数据的
  • 扩展 prestashop web 服务资源

    我正在尝试延长carts多一个字段的资源应输出以下结果Cart getSummaryDetails称呼 我已经延长了CartCore类添加新参数和相应的方法 如下所示 class Cart extends CartCore protecte
  • MS Access 通过文本框而不是下拉列表搜索记录

    我对 MS Access 还很陌生 我正在尝试创建一个简单的表单 基本上将使用文本框而不是下拉框搜索特定记录 本质上 用户将能够输入 ID 号并检索一些其他相关信息 但是 我不希望用户能够向数据库添加任何新记录 我已经能够让表单看起来像我想
  • 使用 Javascript 转到本地 URL

    同样的问题here但我需要在 Firefox 中访问本地 URL 我尝试使用类似的代码 var url file E Test Test htm window location href url 但 id 不起作用 尝试去与window l
  • PHP PDO 缓存

    我一直在寻找这个问题的答案 但没有在任何地方找到 对 PDO prepare 的调用是否已缓存 或者我应该自己缓存结果 即如果我执行以下操作 function foo handle PDO prepare do stuff with the
  • SQL Server ORDER BY 日期和最后的空值

    我正在尝试按日期订购 我希望最近的日期排在最前面 这很简单 但是有许多记录为空 并且这些记录位于任何具有日期的记录之前 我尝试了一些方法但没有成功 ORDER BY ISNULL Next Contact Date 0 ORDER BY I
  • 更改 PreferenceActivity 文本颜色

    我想将 Android 应用程序的首选项屏幕的外观更改为深色文本颜色 我怎样才能做到这一点 我已经将背景更改为白色 我假设您使用一个 Activity 来扩展PreferenceActivity 您可以使用setTheme方法在您的首选项屏
  • 使用 web.config 允许服务器端包含在 HTML 文件中 (IIS)

    在IIS 7 5中 是否可以使用网络配置单独启用SSI处理具有以下内容的文件 html扩大 具体来说 我不想使用默认的 SSI 扩展 shtml Reason 我不想更改扩展名 这样做会导致搜索引擎结果中的链接损坏 另外 我这样做的动机是网
  • asp.net core 2.0中的机器密钥?

    我有相同的 asp net core 2 应用程序在 2 个不同的服务器上运行 但使用相同的数据库来存储用户等 问题是 如果我在一台服务器中创建并设置用户密码 则运行同一应用程序的另一台服务器将返回无效密码 反之亦然 几年前 我在使用 AS
  • 用于平铺列表视图的 WPF 工具包

    我需要创建格式良好的按钮图块 例如 Windows 8 起始页 是否有任何工具包可用于自定义 ListView 它可能支持平铺视图或网格视图 具有一些格式设置 并且可能有一些动画选项 我尝试创建自己的自定义列表视图 但这似乎是一项复杂的任务
  • 如何避免 super() 无限递归?

    我有这样的代码 class A object def init self self a 1 class B A def init self self b 2 super self class self init class C B def
  • 如何输入带密码的命令进行git pull?

    我想在一行中执行此命令 git pull my passphrase 怎么做 这并不完全是您所要求的 而是针对 http s 的 您可以将密码放在 netrc 文件中 Windows 上为 netrc 从那里它会被自动拾取 它将进入您的主文
  • 如何使用 jQuery Migrate 插件

    我正在使用 jquery 2 0 但还想使用 jQuery migrate 插件 以便我的网站可以在旧版浏览器上运行 然而 我一直没能成功地让它发挥作用 我的 html 标题部分有以下内容
  • 如何拦截具有标准 java 功能(无 AspectJ 等)的方法调用?

    我想拦截对某个类 MyClass 的所有方法调用 以便能够对某些 setter 调用做出反应 我尝试使用动态代理 但据我所知 这只适用于实现某些接口的类 但MyClass没有这样的接口 除了实现包装类之外 是否还有其他方法将所有调用委托给成