【问题标题】:How to hook into an auto-generated Java method?如何挂钩自动生成的 Java 方法?
【发布时间】:2016-06-12 00:39:05
【问题描述】:

编辑:最初是一个让我的工作更轻松的低优先级问题,现在已经成为 Java 巫术中一个非常有趣的练习。谢谢大家的意见!

我正在使用自动生成的 Java 代码(特别是 AnyLogic 生成的代码),它会生成一个名为 onChange() 的方法。我想在调用onChange() 时调用我自己的方法。有没有办法通过反射或其他标准 Java 机制“挂钩”onChange()

【问题讨论】:

  • 您是否尝试过使用 AOP(AspectJ 或 Spring AOP)。您可以有一个方面建议可以在给定切点之前或周围调用给定方法。你可以[在这里找到更多] (docs.spring.io/spring/docs/current/spring-framework-reference/…)
  • 如果 onChange 没有钩子,则可能有另一种方法可以通过扩展它或更改配置来完成覆盖。最好使用框架推荐的方式。
  • AOP 也是我的第一个想法,但在这个框架中相当困难:如果记忆有用,它是我们当地大学某人硕士项目的一部分,以便将其集成。不幸的是,我无法覆盖onChange(),因为自动生成破坏了我编写的方法。我希望软件包的维护者在未来能解决这个问题——我已经纠缠过他们——但我认为我需要在此期间解决一个变通办法。
  • 没有人可以回答,除非您向我们提供有关该方法如何“自动生成”的更多信息,您是否使用任何容器等。即使它是第三方库,您仍然可以制作使用 AOP。 AOP 不要求您“覆盖”该方法。当然还有其他选择,例如使用检测代理、使用 javassist 等,但我相信它们都适用于某些我们无法判断它们是否适用于您的情况
  • @DylanKnowles 感谢您的解释;我会考虑的。但它仍然有助于了解 AnyLogic 上下文,因为这是在什么情况下将生成 Java 的起点(从而为问题提供 Java 上下文)。我还不会注销一个更“AnyLogic-y”的解决方案......

标签: java reflection java-8 anylogic


【解决方案1】:

我可以建议的一个解决方案是使用Proxy 对象。 Here 是一个可能对你有所帮助的教程。

【讨论】:

  • 自动生成的代码创建一个 Java 类而不是一个接口。代理似乎是基于接口的:在这种情况下我如何使用代理? (可能是我误解了代理的工作原理。)
  • 不,它不允许我们使用类。我现在能想到的唯一解决方案是使用像CGLib 这样的外部库。关注this 教程。它的工作方式与 Proxy 相同,但通过创建 Super 具体类的子类。它还使用与 InvocationHandler 相同的 API。
  • @DylanKnowles 这个类是通过接口调用的吗?方法名称 (onChange()) 确实表明它是。在这种情况下,您可以使用代理。
  • 不幸的是,它是一个名为 Agent 的核心类(即,不是接口),所有代理子类都从该类派生:所有子类在编译时都会自动生成其 onChange 方法。 这就是说,我想知道我是否可以让我的代理子类扩展一个带有onChange()的接口,然后自动生成,然后我使用代理挂钩到接口,然后应该让我挂钩到生成的onChange()?
  • 哈!看来我真的可以做到!现在我只需要弄清楚如何让这个代理工作......
猜你喜欢
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2020-12-20
  • 2016-12-07
  • 2011-08-17
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多