gpt4 book ai didi

java - 监控对象字段数据的变化 "from the outside"

转载 作者:行者123 更新时间:2023-11-29 04:02:41 27 4
gpt4 key购买 nike

假设我有一个常规的简单 Java 类,例如:

public class Foo {
private int data;

public int getData() {
return data;
}

public void setData(int data) {
this.data = data;
}
}

...我现在希望追溯(即不更改 Foo 的实现)做一些魔术,以便我可以监视“数据”字段的更改。如果我可以监控 setData() 调用,我会非常高兴。

我知道我可以使用 java.lang.reflect.Proxy 实例和 InvocationHandler 做一些接近于此的事情。但是,仅当数据属性通过代理更改时(自然地)才会涉及处理程序。而且据我了解,代理需要实现一个接口(interface)才能可用。所以下面的例子工作正常:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface IFoo {

public void setData(int data);
}

class Foo implements IFoo {

private int data;

public int getData() {
return data;
}

public void setData(int data) {
this.data = data;
}
}

class MyInvocationHandler implements InvocationHandler {

private final Object monitoredInstance;

public MyInvocationHandler(Object monitoredInstance) {
this.monitoredInstance = monitoredInstance;
}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Invoked!");
return method.invoke(monitoredInstance, args);
}
}

public class ProxyTest {

public static void main(String[] args) throws Exception {
Foo foo = new Foo();

IFoo fooProxy = (IFoo) Proxy.newProxyInstance(
Foo.class.getClassLoader(),
new Class[]{IFoo.class},
new MyInvocationHandler(foo));

fooProxy.setData(42);
System.out.println("foo data = " + foo.getData());
}
}

但我的上述问题是需要静态定义的 IFoo 接口(interface)。如上所述,我正在寻找一种完全不需要修改 Foo 实现的解决方案。

(我已经弄清楚如何使用 Java Compiler API 动态创建、编译和加载接口(interface),如 IFoo。我可以遍历 Foo.class 的方法名称,找到所有“setter”,并创建一个具有这些接口(interface)的接口(interface). 尽管如此,在弄清楚所有这些之后,我真的不确定它是否对我有帮助。:-))

我希望所有这些监控业务对 Foo 实例的用户是完全透明的。我希望我最终能得到一些非常 slim 的东西,比如:

Foo foo = new Foo();
ObjectMonitor om = new ObjectMonitor();
om.monitor(foo);
foo.setData(42); // The ObjectMonitor should notice this.

有办法吗?

最佳答案

如果您所说的“实现”是指“源代码”,也许方面可以帮助您。使用 AOP,您可以将类似的东西添加到您的类方法中,并且一些 AOP 实现可以更改您的类的字节码,从而确保检测到您的类的所有使用。

如果字节码本身不能被修改,那你可能就不走运了。

关于java - 监控对象字段数据的变化 "from the outside",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2392782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com