如何将方法添加到方法名称基于AspectJ中现有的带注释方法的类中?

时间:2011-07-20 13:45:33

标签: java security annotations aspectj aspect

考虑以下代码:

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 = ""
}

1 个答案:

答案 0 :(得分:4)

据我所知,遗憾的是,使用动态签名添加方法(在AspectJ中称为Inter Type声明)是不可能的,因此无法根据其他方法的名称或参数创建方法。

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