初始化字段后的方法执行

时间:2015-01-10 19:53:19

标签: java aspectj

我有一个定义数据库行访问的类。

public abstract class DBRow {
    int index;

    DBConnection connection;

    public DBRow(DBConnection con, int id) {
        connection = con;
        index = id;
    }

    public DBRow(DBConnection con) {
        this(con, -1);
    }

    public abstract String getTableName();

    private static String getFieldName(Field field) {
        ...
    }

    public void save() {
        ... (Reads all fields that are annotated with @InDB and saves them
    }

    public void load() {
        ... (Will load a row from the database or create a new one if index == -1)
    }
}

数据库中的特定行扩展了此DBRow类。 例如:

public class Test extends DBRow {
    @InDB
    public String vct;

    @InDB
    public int intt;

    public Test(DBConnection con, int id) {
        super(con, id);     

        vct = "test";
        intt = 123;
    }

    @Override
    public String getTableName() {
        return "test";
    }
}

在调用构造函数之后,应调用“load”,因此该行将从数据库加载,或者将被正确创建和保存。

public aspect DBRowLoadSave {
    pointcut load() : execution(DBRow.new(*, *));

    after() : load() {
        ((DBRow)thisJoinPoint.getThis()).load();
    }
}

我的问题是,此时字段不会被初始化,因为切入点会在Test的母类中侦听构造函数调用,而不是在Test本身中。有没有办法可以监听子类的所有构造函数,还是有另一种方法可以在完成类的完成后执行load方法?

2 个答案:

答案 0 :(得分:2)

execution(DBRow+.new(..))匹配所有子类构造函数,但包含基类。因此,您需要通过!execution(DBRow.new(..))将其排除。

此外,您可以通过this()将创建的对象直接绑定到变量,避免getThis()调用和建议中的强制转换。

public aspect DBRowLoadSave {
    pointcut load(DBRow dbRow) :
        execution(DBRow+.new(..)) &&
        !execution(DBRow.new(..)) &&
        this(dbRow);

    after(DBRow dbRow) : load(dbRow) {
        System.out.println(thisJoinPoint);
        dbRow.load();
    }
}

答案 1 :(得分:0)

我不确定到底发生了什么,因为你的构造函数没有调用任何方法,因此初始化对象应该没有问题。一些猜测修复将是:

public Test(DBConnection con, int id) {
    vct = "test";
    intt = 123;
    super(con, id);
}

在调用超级构造函数之前设置值,或

public String vct = "test";

public int intt = 123;

public Test(DBConnection con, int id) {
    super(con, id);
}

将值直接设置为字段。如果这些不起作用,初始化没有问题,问题出在其他地方。