考虑以下代码:
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 = ""
}
答案 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对或其他新方法。