【问题标题】:How to add a method to a class where the method name is based on an existing, annotated method in AspectJ?如何将方法添加到方法名称基于 AspectJ 中现有的注释方法的类中?
【发布时间】:2011-07-20 13:45:32
【问题描述】:

考虑这段代码:

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

【问题讨论】:

  • 您只是想添加一个名为deleteAllowed 的方法,还是想通过delete 方法已经存在这一事实以编程方式派生方法名称?

标签: java security annotations aspectj aspect


【解决方案1】:

不幸的是,据我所知,不可能使用动态签名添加方法(在 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 对或其他新方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    相关资源
    最近更新 更多