我正在使用一些使用自定义旧Java库的应用代码。不幸的是,当变量(在库类中)发生变化时,我遇到了触发事件的需要。我需要监听的变量没有getter和setter,而且我无法访问原始源代码。
我已经考虑过使用循环来检查变量,尽管这似乎需要太多的CPU周期。另一个选择是计时器,虽然它似乎不是最好的选择。
根据我的研究,我不能使用Java标准库中内置的Observable / Observer函数,也不能使用属性更改侦听器,因为我无权访问源代码。
在这种情况下,最好的选择是什么?还有另一种可能性,我可能不会考虑吗?
答案 0 :(得分:0)
@ user949300提供的解决方案如下:
public class Legacy {
public int value;
}
public class LegacyWrapper {
private Legacy legacy;
public LegacyWrapper(Legacy legacy) {
this.legacy = legacy;
}
public void setValue(int newValue){
legacy.value = newValue;
notifyChange();
}
public int getValue(){
return legacy.value;
}
}
正如所说的那样,代理模式(代理包装器和真实主题之间的关系是在编译时),只有当您的遗留对象被您直接更改时,才建议这样做,因此控制方式(使用setValue方法调用)会更改是可能的。
答案 1 :(得分:0)
感谢所有建议使用AspectJ的人! 以下是我能够做到的事情:
public aspect MyAspect
{
before(int newValue): set(int myVariable) && within(org.example.MyClass) && args(newValue)
{
//The value of integer x has changed in class MyClass, fire an event here.
}
}
package org.example;
public class MyClass
{
public int x = 0;
}