问题标签 [method-interception]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
450 浏览

java - 如何在 call() 之前劫持 Callable 并执行隐藏方法

我正在为一个更大的项目(HypergraphDB)中的一些子系统添加实现,我应该避免修改重要的代码。在这个项目中,大约有 70 个 Callable 对象,它们为某些数据库操作定义事务块。我正在替换该数据库,而我的(redis)在定义事务块之前需要所有受影响的键。所以我需要访问这些 Callables 中的部分,并在执行 call() 之前执行一些操作(“watch”)。

一些可调用对象是非平凡的,对于其中一些,我需要在该可调用对象中声明最终字段,并将它们定义为调用的“外部”,因此 call() 和 getHandles() 都可以访问它们。

为了能够访问 getHandles 方法,我定义了一个只有 getHandles 方法的接口。要访问 getHandles,我可以暂时将 Callable 强制转换为该接口,现在在 IDE 中它“看到”该方法,但 atm 我无法测试它。

这行得通吗?

之前的代码:

之后的代码:

接口可处理:

}

最后在哪里调用它:

0 投票
3 回答
817 浏览

javascript - 你可以向被劫持的 JavaScript 数组添加一个函数吗?

这个问题与在 Javascript 中声明数组时要遵循的最佳实践是什么有关?


假设一个客户端,我们称他们为“DB Cooper”,首先要求以下代码必须在任何其他 JavaScript 代码之前运行:

此外,Cooper 要求必须将自定义函数添加到内置Array对象(而不是被劫持的对象)中。例如,如果Array被劫持,这将通过以下方式完成:

这将负担得起:

但是,这与第一个要求不兼容。因此,您如何才能最好地满足 DB Cooper 的这两个要求?

注意: DB 甚至写了一个测试小提琴来帮助确保解决方案满足他的要求……真是个家伙!


更新: 对于那些喜欢挑战的人:请尝试找到一个不可劫持的跨浏览器解决方案来解决这个问题。例如,这里有一个更被劫持的测试用例(感谢重新格式化这个 Bergi),它劫持了 Array、Object、Array.prototype.constructor 和 Object.prototype.constructor。到目前为止,看起来可能有一个特定于浏览器的解决方案(参见Bergi 对他的回答的评论,如果你找到在 FF 中劫持它的方法,请告诉我们),但目前尚不清楚是否存在一个跨浏览器的解决方案。

0 投票
1 回答
725 浏览

asp.net-mvc-3 - 使用 Autofac 和 MVC3 创建拦截器

我需要创建一个将通过 Autofac 连接的性能监控拦截器。不幸的是,它是针对 MVC3 项目的,这意味着我使用的是 Autofac 2.6.3,因为 Autofac 3 仅与 MVC4 兼容。因此,我不能使用Autofac.Extras.DynamicProxy2Nuget 包,因为它与 MVC3 不兼容。

我发现AutofacContrib.DynamicProxy2,它与Autofac 2.6.3. 问题是,由于依赖项之间的版本不匹配,Nuget 包无法安装。问题突出如下:

  • AutofacContrib.DynamicProxy2
    • 取决于'Autofac(> = 2.4.5.724)'
    • 取决于“Castle.Core (>= 2.5.2)”。
    • 取决于“Castle.DynamicProxy (>= 2.2.0)”。
      • 取决于“Castle.Core (= 1.2.0)”。

我收到以下 Nuget 包安装错误:

将“Castle.Core 2.5.2”更新为“Castle.Core 1.2.0”失败。找不到与“Castle.Core 1.2.0”兼容的“AutofacContrib.DynamicProxy2”版本

如何使用 MVC3 和 Autofac 执行方法拦截?

0 投票
1 回答
680 浏览

java - MethodInterceptor 重试 HttpInvoker 调用

HttpInvoker在富客户端 gui 上使用 Spring Framework。有时人们的互联网连接出现问题,互联网连接故障会导致应用程序崩溃。我想在放弃之前重试失败的方法几次。

我尝试编写一个方法拦截器来完成此操作,但第二次调用:

总是用RuntimeException包装 a炸毁NullPointerException

你不能methodInvocation.proceed()多次调用这个方法还是有一些技巧?

0 投票
1 回答
1618 浏览

java - Spring ProxyFactoryBean 服务拦截不唯一

借助ProxyFactoryBean和MethodInterceptor拦截多个服务接口时,当服务接口方法名相同时,拦截器由于某种原因混淆了服务接口。我的问题是:

1.)使用单个 ProxyFactoryBean 拦截多个接口时是否需要遵守规则?

2.)代码哪里出错了?我尝试在“proxyInterfaces”列表中切换 AnotherService 和 AService 的顺序,但这也不起作用。

3.)我通过将 ProxyFactoryBean 一分为二解决了这个问题(参见底部的“解决方法”)。这是唯一的解决方案,还是有一种方法可以按照“代码”部分中的说明保留 ProxyFactoryBean?

代码:

我有几个使用ProxyFactoryBean拦截的服务:

拦截器类 MyInterceptor 像这样实现“调用”:

服务接口声明如下:

现在,当我将 AService 自动装配到一个类中时,我希望我可以使用 AService 的删除和测试功能:

在我的拦截器中,“aService.test()”调用没有问题。但是,“aService.delete()”调用以某种方式触发了接口 AnotherService。拦截器的控制台输出如下:

解决方法: 我将ProxyFactoryBean一分为二,使用两个单独的拦截器 bean(尽管它们都引用与以前相同的类):

现在,此配置产生预期的输出:

0 投票
1 回答
6127 浏览

java - 在 Spring 中使用 MethodInterceptor

我有以下配置来拦截方法并在从方法返回后应用建议,但是,以下配置不起作用。你能建议我缺少什么吗?

我有 EventSubscriber,当它被调用和方法返回时,我需要拦截方法调用并做一些事情......在这种情况下,打印“内部建议”。

我没有看到任何异常,只是没有调用方法建议。

0 投票
1 回答
1004 浏览

java - Guice 中的多个方法拦截

我正在使用 Guice 的方法拦截功能。我需要知道的是如何正确实现多个拦截器,形式如下:

具体来说,如果在两个拦截器中都调用了proceed(),会发生什么?被截获的方法会被调用两次吗?还是第一个拦截器中的继续()调用第二个拦截器,然后调用该方法?还是应该只有一个拦截器有一个proceed()?

谢谢

0 投票
1 回答
407 浏览

c# - 基于属性的属性拦截。如何?

我有一个实体的抽象类,负责为每个实体实例生成和返回唯一键。密钥生成有点昂贵,并且基于具体实体的属性值。我已经标记了参与密钥生成的属性,KeyMemberAttribute所以我需要做的就是在EntityBase.Key每次装饰有KeyMemberAttribute更改的属性时使 = null 。

所以,我得到了这样的基类:

然后我得到了如下实现的具体实体

每次属性值更改时,我都需要将其KeyMemberAttribute设置为EntityBase.Keynull

0 投票
0 回答
609 浏览

scala - scala中的方法调用拦截

嗨,我想知道是否有一种方法可以反射(或以其他方式)拦截发送到类的所有方法调用。我知道使用 Dynamic 可以拦截未知方法,但是类中已经定义的方法呢​​?

我想找到一种方法来做到这一点,而不必修改方法的语法(因为它是为了拦截方面框架中的方法)。

作为我想做的一个例子,想象一下:

}

0 投票
1 回答
818 浏览

c# - 带有异步的 Postsharp AOP MethodInterception 方面

在我的 winform 程序中,我在每个控制事件上使用 Postsharp 拦截器类来避免 try/catch 块重复。

自定义 postsharp 方法:

使用这个属性:

这就像一个魅力但知道我想在事件中使用异步。所以 txtComments_textChanged 变成:

问题来了。当异步时,拦截器方法中的 Try/catch bloc 不会捕获任何内容...我该怎么办?谢谢