java - 如何向类中添加方法,其中方法名称基于 AspectJ 中现有的带注释的方法?

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

最佳答案

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

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

关于java - 如何向类中添加方法,其中方法名称基于 AspectJ 中现有的带注释的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6762975/

相关文章:

java - android.permission.RECEIVE_BOOT_COMPLETED 不会在启动时启动 Activity

windows - 如何防止 DLL 注入(inject)

c# - 检查 Web API 中的 AllowAnonymousAttribute

php - 我可以在 symfony-2.0 中使用服务类的注释吗?

c# - 访问属性的最佳方式

java - 将字符串转换为 MAILTO 的 HTML 就绪文本 : URL

java - 如何从 netbeans 创建动态 JLabel

c++ - 黑盒系统。自定义主机上的安全软件

r - 条形图上条形上方 ggplot 上的汇总统计量注释

java - 如何告诉 EclipseLink 在全局范围内对某种类型使用 XmlAdapter?