问题标签 [invocationhandler]

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 回答
383 浏览

java - 创建一个无操作调用处理程序

我正在尝试使用 JavaInvocationHandlerProxy类创建一个无操作“侦听器”。我不确定下面的实现是否能处理所有场景,也不确定它是否是最佳解决方案。我真正想要的是这个类没有效果。有没有比下面更好的方式来表达这个概念?

也许我在这里叫错了树。同样,这是一种在侦听器接口初始化时创建代理、占位符或Null 对象的简单方法。这里的想法是可以注入此侦听器并防止意外调用null引用。有没有更好的方法来完成我在这里尝试做的事情?或者有人在我不知道的开源项目中写了类似的东西?我知道番石榴Optional,但这并不是我真正想要的。

0 投票
3 回答
576 浏览

java - Java 7 - 自定义方法装饰,没有默认委托所有,其他,许多方法

我想装饰接口PreparedStatement,以便自定义关闭它(只是一个例子)。

这意味着我想装饰 的现有实例PreparedStatement,从而在调用其他代码时close()调用它。

为此,我需要默认实现装饰器的所有数十种方法,PreparedStatement只是为了将调用委托给内部对象,就像在此处完成的那样。缺点是它只是大量的工作和代码,几乎没有附加价值。

另一种选择是尝试使用 Java 的Proxy 和 InvocationHandler以提供默认实现,该实现在单个方法中为所有方法执行委托。如果存在自定义方法,则InvocationHandler会将调用定向到该方法。请参见此处的示例。此解决方案的问题是无法将自定义方法标记为@Override并且无法检查其签名的正确性,因为它需要一个 abstract PreparedStatement,代理将无法实例化它。

那么,这可以做到吗?如何?

* 必须能够使用 Java 7 max 来实现,但请随时提供 Java 8 答案。

0 投票
0 回答
146 浏览

java - 用于对已编码并正在使用的类进行运行时预处理的 java 注释

我想为可以在方法开始之前执行一些代码的方法定义一个注释。

据我了解,可以使用代理和调用处理程序来执行此类任务(例如: http: //www.concretepage.com/java/dynamic-proxy-with-proxy-and-invocationhandler-in -java )。然而,这意味着首先定义一个接口,然后是一个实现该接口的类,然后使用代理。

所以如果有一些现有的代码,已经在使用一个类,这种技术将不允许我添加注释并保持其他所有内容不变..

有没有办法在java中进行这样的注释?

谢谢

0 投票
2 回答
1000 浏览

java - 序列化代理

我正在尝试将调用处理程序序列化为文件。我只是试图序列化以下部分,因为它是程序中唯一会改变的部分:

我收到以下错误 run:Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: <any> at jdkproxydemo.JdkProxyDemo.main(JdkProxyDemo.java:69) C:\Users\ACK\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 1 second)

这是完整的代码:

}

实现此结果的最佳方法是序列化代理对象是什么?

0 投票
0 回答
38 浏览

java - 不使用 AOJ 或类似的 Java 静态类中“装饰”方法的选项

我有一个静态类,它有许多名称不同但签名相同的方法,例如:

我希望这些特定方法在输入时执行一些代码,例如

无需在每种方法中复制此代码。

我正在研究以下技术,并想知道哪种技术可能/最好,或者是否有更好的方法:

  • 为包含的静态类使用代理并通过 InvocationHandler 添加所需的代码
  • 使用特殊的 invoke() 扩展 java.lang.reflect.method 类
  • 只需使用一些初始 methodInit(args) 调用复制每个方法中的代码

我愿意使用通过 Java10 可用的任何核心内容

0 投票
1 回答
133 浏览

java - HashMap 的代理 NullPointerException

我正在尝试在我的 WebApp 和磁盘上的存储之间建立代理。我知道 WebApp 一切正常,它甚至将内容保存到磁盘,所以我知道 InvocationHandler 上的 Invoke 方法被调用,但代理本身似乎为 Null,因此 WebApp 上没有任何内容得到更新。

创建代理:

}

调用处理程序:

我已经检查并在创建名为“FileStorageMap”的 InvocationHandler 时,文件夹和 proxiedMap 是数据字段,它们都不是 Null,它们都已正确填写。但是对于代理本身,它返回 NullPointerException。谁能告诉我这是为什么?

0 投票
1 回答
515 浏览

java - 异步 Rest API 调用的调用处理程序

我曾在一个带有 SOAP Web 服务的应用程序上工作,其中所有的肥皂 api 调用都将使用处理程序方法调用通过一个地方触发。

我还没有详细看到实现,但我知道它是如何工作的。

我们是否可以开设一堂课,让我可以在所有 REST api 命中之前和收到响应之后跟踪它。我用弹簧。除了 AOP,如何为 REST 服务编写处理程序方法调用?

我要问的是,我可以在一个地方调用所有请求并异步获取响应的方法调用处理程序机制,而不是在我进行休息调用的所有服务中编写 RestTemplate.exchange() 吗?

0 投票
2 回答
1129 浏览

java - 在我的代理类中为每个方法执行 InvocationHandler 调用方法

我已经实现了一个动态代理,以便在我的方法开始之前执行一些操作。现在我从代理类调用两个方法时遇到问题,这里是代码:

动态代理类:

主类:

代理类:

实际输出:

如图所示,invoke 方法仅在初始化代理后的第一个方法调用时执行,第二个方法直接调用,没有代理功能。

我的目标是每次调用我的集合中出现的方法时执行调用方法,预期的结果应该如下所示。

预期输出:

如果需要更多解释,请告诉我。

0 投票
1 回答
159 浏览

java - 我在使用 jdk 动态代理时遇到问题

之前用spring aop和cglib,现在换了一个简单的例子。发现执行方法sayHello1()和sayHello2()都输出“before”和“after” 天啊,好难,懂我在说什么吗关于?我现在快疯了。TT

0 投票
1 回答
147 浏览

selenium - 使用代理包装器后没有此类元素异常

为了关闭我网页上的随机弹出窗口,我遵循了使用代理包装器包装网页元素的教程: https ://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-弹出警报/

在我的代码中实施此解决方案后,随机弹出窗口关闭,但我遇到了以前没有的“没有此类元素异常”。我试图通过使用不同的元素和方法来更改代码行,但我的行为没有解决这个问题 - 没有元素被识别。

我将不胜感激任何帮助:)

导致异常的方法(最后一行):

代理页面工厂类:

元素保护类:

元素代理类:

错误:

org.openqa.selenium.support.ui.ExpectedConditions.elementIfVisible(ExpectedConditions.java:314) 上 com.sun.proxy.$Proxy27.isDisplayed(Unknown Source) 上的 java.lang.reflect.UndeclaredThrowableException。 support.ui.ExpectedConditions.access$000(ExpectedConditions.java:43) at org.openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:300) at org.openqa.selenium.support.ui.ExpectedConditions$10 .apply(ExpectedConditions.java:297) at org.openqa.selenium.support.ui.FluentWait.lambda$checkConditionInLoop$2(FluentWait.java:233) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run( CompletableFuture.java:1764) 在 java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1756) 在 java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)在 java.base/java。util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1016) 在 java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665) 在 java.base/java.util.concurrent.ForkJoinPool。 runWorker(ForkJoinPool.java:1598) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) at ✽。我执行一个动作来调用块(file:///C:/Users /may/Desktop/automation-git/GTH-QA/cucumber/features/Blocks.feature:9) 引起:java.lang.reflect.InvocationTargetException at jdk.internal.reflect.GeneratedMethodAccessor6.invoke(Unknown Source) at java。 base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at infrastructure.ElementProxy.invoke(ElementProxy.java: 27) 在 com.sun.proxy.$Proxy27。isDisplayed(Unknown Source) at org.openqa.selenium.support.ui.ExpectedConditions.elementIfVisible(ExpectedConditions.java:314) at org.openqa.selenium.support.ui.ExpectedConditions.access$000(ExpectedConditions.java:43) at org .openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:300) at org.openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:297) at org.openqa.selenium.support .ui.FluentWait.lambda$checkConditionInLoop$2(FluentWait.java:233) 在 java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1764) 在 java.base/java.util.concurrent。 CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1756) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec( ForkJoinPool.java:1016) 在 java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1598) 在 java.base/java.base/java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665) .util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) 引起:org.openqa.selenium.NoSuchElementException:没有这样的元素:无法找到元素:{“method”:“xpath”,“selector”:“/ /div[contains(text(),'SEARCH RESULTS')]"}(会话信息:chrome=86.0.4240.111)有关此错误的文档,请访问:没有这样的元素:无法找到元素:{"method":"xpath","selector":"//div[contains(text(),'SEARCH RESULTS')]"} (会话信息:chrome=86.0.4240.111 ) 有关此错误的文档,请访问:没有这样的元素:无法找到元素:{"method":"xpath","selector":"//div[contains(text(),'SEARCH RESULTS')]"} (会话信息:chrome=86.0.4240.111 ) 有关此错误的文档,请访问:https://selenium.dev/exceptions/#no_such_element *** 元素信息:{Using=xpath, value=//div[contains(text(),'SEARCH RESULTS')]} at jdk.internal.reflect.GeneratedConstructorAccessor15.newInstance(Unknown Source) at java.base/jdk .internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) 在 java.base/java.lang.reflect.Constructor.newInstance (Constructor.java:481) 在 org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:196) 在 org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java :129) 在 org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:160) 在 org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:160) 在 org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:53)。openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) at org.openqa.selenium.remote.RemoteWebDriver.findElement( RemoteWebDriver.java:333) 在 org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) 在 org.openqa.selenium.By$ByXPath.findElement(By.java:394) 在 org.openqa.selenium .remote.RemoteWebDriver.findElement(RemoteWebDriver.java:325) 在 org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) 在 org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke (LocatingElementHandler.java:39) 在 com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17 更多java:83) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:333) 在 org.openqa.selenium.remote 的 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) .RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) 在 org.openqa.selenium.By$ByXPath.findElement(By.java:394) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:325) 在org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:39) 在 com.sun.proxy 的 org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70)。 $Proxy25.isDisplayed(Unknown Source) ... 17 更多java:83) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:333) 在 org.openqa.selenium.remote 的 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) .RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) 在 org.openqa.selenium.By$ByXPath.findElement(By.java:394) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:325) 在org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:39) 在 com.sun.proxy 的 org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70)。 $Proxy25.isDisplayed(Unknown Source) ... 17 更多java:333) 在 org.openqa.selenium.By$ByXPath.findElement(By.java:394) 在 org.openqa.selenium.remote 的 org.openqa.selenium.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) .RemoteWebDriver.findElement(RemoteWebDriver.java:325) 在 org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) 在 org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler .java:39) 在 com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17 更多java:333) 在 org.openqa.selenium.By$ByXPath.findElement(By.java:394) 在 org.openqa.selenium.remote 的 org.openqa.selenium.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) .RemoteWebDriver.findElement(RemoteWebDriver.java:325) 在 org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) 在 org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler .java:39) 在 com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17 更多findElement(DefaultElementLocator.java:70) at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:39) at com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17更多的findElement(DefaultElementLocator.java:70) at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:39) at com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17更多的