编辑:我在https://stackoverflow.com/a/60235242/3236516描述了我们的解决方案
我有一个 java 对象。它是扩展抽象类的许多子类之一的实例。我想修改它的一种方法,以便在调用原始方法之前运行一些额外的代码。我的目标在概念上与 AspectJ 中的切入点相同。
如果我创建原始对象的一些修改版本而不是改变原始对象,那很好。如果解决方案涉及字节码操作,也可以。
前期工作
我考虑过通过 JavaAssist 创建代理。麻烦的是,ProxyFactory 的 create 方法要求我提前知道构造函数的输入类型。我不。我可以在不通过 Objenesis 调用构造函数的情况下创建我的对象,但是生成的代理对象对于构造函数设置的任何值都将具有空值。这意味着只要直接引用构造函数设置的值,我生成的对象的行为就会与原始对象不同。
语境
我们通过 AWS Kinesis Data Analytics 使用 Flink 来转换一些流数据。我们希望在所有StreamOperator 的open() 方法的开头包含一些通用代码,而无需修改每个运算符。一个用例是确保自定义指标代理在操作员运行的每个实例上运行。