更改变量时触发事件的最有效方法是什么,而不修改类源代码?

时间:2015-11-14 23:18:04

标签: java

我正在使用一些使用自定义旧Java库的应用代码。不幸的是,当变量(在库类中)发生变化时,我遇到了触发事件的需要。我需要监听的变量没有getter和setter,而且我无法访问原始源代码。

我已经考虑过使用循环来检查变量,尽管这似乎需要太多的CPU周期。另一个选择是计时器,虽然它似乎不是最好的选择。

根据我的研究,我不能使用Java标准库中内置的Observable / Observer函数,也不能使用属性更改侦听器,因为我无权访问源代码。

在这种情况下,最好的选择是什么?还有另一种可能性,我可能不会考虑吗?

2 个答案:

答案 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;
}