栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么是AspectJ中的类型间声明的简短示例,说明该方法的有用性?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么是AspectJ中的类型间声明的简短示例,说明该方法的有用性?

我想在亚当的答案中再加上一个例子。

使用方面是改善软件和OOP模块化的一种方法,只是OOP是“垂直”应用而AOP是“水平”应用。

因此,尽管可以使用建议来“水平”修改所有方法的行为以响应某些条件,但是建议中的代码还需要一些数据,ITD可以“水平”添加字段,同时包含在单个编译单元(方面)中相关的数据和代码。

由于您是通过ITD字段添加数据的,因此您可能还希望提供一些操作这些字段的方法,例如setter / getter。

我几次尝试改写它,希望它易于理解。

举个例子,假设您有一个图形编辑程序,用户可以在其中创建,删除和显示许多Shape(相当经典的eh?:D)。

形状具有大量数据,例如,它们具有颜色,坐标等。它们正确地属于类本身。但是,由于这是一个Web
3.0应用程序,因此您希望用户能够在单个图形上进行协作,这意味着每种形状都必须知道何时更改了它,如果已与其他用户交流过该形状已更改,是否需要更改被实际拖动它的某个用户锁定等。

您可以在简单的OOP中执行此操作,在Shape或任何根类中实现相关的部分,但是您将使用“
this.setDirty(true)”之类的调用污染所有的setter。

相反,您决定进行AOP并在一个方面实施它。在这种情况下,您可以轻松地在所有设置器之后添加建议,但是如果您要优化只发送变化增量的网络协议,则还需要存储“脏”布尔值,甚至是更改的属性列表。

你可以像这样实现

public aspect ShapesAreDirtyThings {   private boolean Shape.dirty;   after(Shape s) : execution(* Shape+.set*(..)) {       s.dirty = true;       // Set some other global field, start a thread to communicate        // to other users about the change, whatever ..    }   public boolean Shape.isDirty() {       return s.dirty;   }   public boolean Shape.findDirtyChildren() { // whatever}

对于普通的AOP,这是您无法做的,仅是将一个建议,该建议所需的数据以及最终将对该数据进行操作的方法封装在一个编译单元中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451373.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号