2

考虑这段代码:

class DatabaseCommands {

    @Privilege(ADMIN)
    public void delete(Something thingToDelete, User currentUser) {
        /* ... */
    }
}

目前,访问检查被编织到此方法中,以检查是否currentUser具有执行数据库命令的必要权限(如果没有则抛出异常)。

我必须向我的 AspectJ 文件添加什么,以便使用新方法

public boolean deleteAllowed(Something thingToDelete, User currentUser)

被添加到类中,具有相同的访问检查,但没有执行命令?

此用例似乎类似于向字段添加 getter/setter 的用例,例如

class Foo {
    @Getter @Setter
    String name = ""
}
4

1 回答 1

4

据我所知,不幸的是,不可能使用动态签名添加方法(在 AspectJ 中称为 Inter Type Declarations),因此无法基于另一个方法的名称或参数创建方法。

@Setter @Getter 不是使用 AspectJ 实现的,而是使用其他技术实现的。Spring Roo 实际上会检查源代码,并生成方面的源代码,然后将其编译并应用于原始类。Lombok 项目和其他项目直接使用 ASM、BCEL 或 APT 来检测 Java 字节码。ASM 与 AspectJ 本身用于修改(AspectJ 术语中的 Weave).class 文件的工具包相同,但直接使用时比 AspectJ 灵活得多(也复杂得多)。APT 是 Sun 的注释处理工具,从 Java 6 开始,它被“嵌入”在 Java 编译器中。它可用于“拦截”Javac 正在编译具有某些注释的方法或类的时刻,并可用于“注入”新代码,包括 getter/setter 对或其他新方法。

于 2011-07-25T22:07:49.967 回答