问题标签 [dynamic-proxy]

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 投票
2 回答
785 浏览

c# - 如何避免使用 DynamicProxy::CreateClassProxyWithTarget 双重构建代理?

我正在使用该CreateClassProxyWithTarget方法装饰现有对象。但是,构造函数和初始化代码被调用了两次。我已经有一个“构造”实例(目标)。我理解为什么会发生这种情况,但是除了使用空的构造函数之外,有没有办法避免它?

编辑:这是一些代码:

首先创建代理:

例如,我将它与以下类的对象一起使用:

如果我现在调用BindingFactory.Create(someKatalogBaseObject);和 属性正在重新初始化。ValuesAttributes

0 投票
3 回答
9035 浏览

c# - 如何将动态代理转换为 POCO?

我试图序列化域模型并遇到了需要将动态代理转换为 POCO 的问题。我遇到的问题是模型中的虚拟属性存在循环引用。尽管我尝试使用[ScriptIgnore]以使序列化程序不解析这些属性,但它仍然可以。我相信这是因为对象是动态代理,并且属性中仍然存在一些残余物导致解析器进入(这反过来导致递归错误“循环引用” - 我尝试将递归限制为 3 个步骤,但我得到了“超出递归步骤”的错误)。

如何将对象从动态代理转换为 POCO 以便可以序列化?

编辑:简单的例子

0 投票
1 回答
112 浏览

spring - 生成的 Spring 动态代理存储在哪里?

谁能告诉我 Spring 框架生成的动态代理(字节码)存储/保存在哪里?

在文件系统上?在记忆中?

0 投票
2 回答
2131 浏览

c# - 如何拦截.Net中来自/到第三方库的非虚拟方法的调用?

我认为我需要的是被 .net 人称为“透明动态代理”的东西,但到目前为止我所看到的所有实现(Castle DynamicProxy、Spring.NET AOP 等)都要求我至少执行以下一项操作:

  1. 将拦截的方法声明为虚拟的
  2. 包装类并创建包装器的实例而不是包装类
  3. 更改继承或实现接口

显然,如果调用者和被调用者都是非虚拟的并且来自第三方闭源库,就是这种情况,我无能为力。

如果 C# 是像 Python 这样的动态语言,我会这样做:

我需要这个来改变与 ThirdyPartyLibB.Bar 交互时 ThirdyPartyLibA.Foo 的不良行为。由于反汇编程序,我确切地知道导致这种行为的原因以及如何更改 Foo 或 Bar 来修复此错误。

一些(不太可能奏效)的想法:

  • 反汇编 ThirdyPartyLibA,更改代码并生成兼容的程序集(不太可能工作,因为它是强名称程序集)
  • 编辑二进制文件以使 Foo 的错误方法虚拟化并更改使其保持有效程序集所需的任何内容,以便我可以使用动态代理(非常不可能工作,也因为与上述想法相同的原因)
  • 找到适合的透明动态代理实现(我认为没有基于此论坛主题:http ://www.pcreview.co.uk/forums/overriding-non-virtual-methods-using-il-and-reflection-发射-t2605695.html )
  • 联系创建库的公司(他们不再支持该产品)
  • 停止使用该库或使用替代方案(不可能,因为它是我们绑定的 RAD IDE 运行时的一部分,因为有大量代码是使用 IDE 自己的语言编写的)
  • 控制对有问题的方法的调用以避免错误(我们已经这样做了,但并没有完全解决问题)

你还有别的想法吗?

PS:对不起我的英语不好。另外,对不起我的 Python。这段代码只是为了说明我需要什么,不要把它当作食谱,因为它太可怕了。

0 投票
2 回答
208 浏览

castle - 使用 Castle 的自代理构造函数?

类的构造函数是否可以在自身周围包装代理?不幸的是,这段代码会导致 StackOverflowException。

我想要某种方法来保证我的类的新实例被包装在代理中,而不是必须创建某种创建代理实例的工厂。

0 投票
2 回答
2972 浏览

java - Json 使用 Jackson 库序列化 JDK 动态代理

我正在尝试使用 Jackson 库序列化 Java 动态代理,但出现此错误:

我得到这个例外:

序列化休眠代理对象时发生的问题似乎相同,但我不知道如何以及是否可以使用 Jackson-hibernate-module 来解决我的问题。

更新:从 Jackson 2.0.6 版本解决了这个错误

0 投票
3 回答
898 浏览

namespaces - 在引用 NSubstitute 的程序集中使用 DynamicProxy 类型时,如何解决“类型存在于两个程序集中”故障?

我有一个使用DynamicProxy 3.1 进行运行时拦截的应用程序。我有一个使用NSubstitute进行模拟的测试程序集。我刚刚针对我完全引导InterceptWith的容器(用于拦截的结构映射)编写了一些“集成”测试,以便我可以断言从容器中出来的某些类型被正确代理。

但是,我收到此错误,表明 DynamicProxy 引用也在NSubstitute程序集中!(它似乎被合并了)。

无论如何围绕这个冲突?

0 投票
1 回答
12579 浏览

java - 如何使用 Spring 和 Java 创建动态代理

我有这种情况:我有一个接口服务,它聚合了所有服务接口。例如,如果我有两个接口 ILoginService1 和 ILoginService2 服务接口看起来像这样

我需要在给定的上下文中可以访问此接口,如下所示:

这是我的解决方案(类似于http://artofsoftwarereuse.com/tag/dynamic-proxy/):

我创建了一个注释 ServiceFacade,我将它放在 Service 接口上,然后我有 BeanPostProcessor,我在其中为 Service 接口创建 DynamicProxy。但问题是服务接口没有从spring组件扫描中获取,即使我在上面放了@Component,但其他组件都放在了Spring容器中。

到目前为止,我该如何解决我的解决方案,或者我遗漏了什么,或者还有其他解决方案?这是源代码:applicationContext.xml

注解:

动态代理的调用处理程序:

BeanPostProcessor 类:

所以,我的问题不是配置,我的问题是如何将 Service 接口附加到 spring 容器以便被 BeanPostProcessor 捕获并为其创建动态代理。到目前为止,这是我的解决方案,也许我遗漏了一些东西,但是如果有人有更好的方法,现在就让我这样做。提前致谢

解决方案:

还需要删除 BeanPostProcessor 和注解。

0 投票
1 回答
2136 浏览

java - 允许动态代理转换到任何兼容的接口。不管

在处理类中的特定方法时,我制作了一个动态代理作为中间人。我这样做是为了避免必须覆盖我需要控制的每个接口中的每个方法。

没有人会理解或关心的华夫饼(但可能会为问题添加更多上下文):

在我要给出的示例中,我尝试使其具有通用性,以便您可以编译它以测试和运行自己,但在实际情况下,我有这样的东西:

如果我要创建一个ConsoleCommandSender实例的代理,则生成的代理应该可以转换为CommandSender. 实际上,ConsoleCommandSender并没有列出它的所有接口,getInterfaces()并且会发生这种情况:

java.lang.ClassCastException: $Proxy18 cannot be cast to org.bukkit.command.CommandSender

Player 类没有这个问题,并且总是可以转换为CommandSender.

真正的问题:

那么,使用以下代码作为起点,如何成功地将 表示的代理转换为myProxy所需的格式,而不必担心ClassCastException?

以下代码将成功编译和运行,但希望您通过转换为 aList而不是ArrayList.

在我就这个问题的初步部分所做的另一个线程上,一个人评论说我可以使用该<T>变量将另一个有效接口添加到列表中。虽然我并不真正了解如何实现这一点,但这似乎是一个好的开始。

0 投票
1 回答
157 浏览

java - 在 Java 中创建动态代理会转移对 OS X 的关注

创建动态代理 (java.lang.reflect.Proxy) 会导致 OS X(至少 10.7 和 10.8)将焦点放在创建代理的 Java 应用程序上。

我创建的代理包装了一个启动外部进程的对象。这个外部进程期望获得焦点,而当 Java 进程窃取焦点时,事情就会失败。

似乎 OS X 正在将 Java 进程提升到 Dock,这就是它从其他应用程序中抢走焦点的原因。有谁知道如何防止这种情况?