- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
/* 0 */ pointcut services(Server s): target(s) && call(public * *(..))
This pointcut, named services, picks out those points in the execution of the program when Server objects have their public methods called. It also allows anyone using the services pointcut to access the Server object whose method is being called. (taken from https://eclipse.org/aspectj/doc/released/progguide/language-anatomy.html)
我正在尝试理解 AspectJ 的切入点,但现在有点困惑。我的主要问题是:您如何解读上述切入点,以及如何将其含义“拼凑”在一起?
为了说明我的困惑,让我们尝试从头开始构建:
下面的切入点会拦截对任何对象的所有公共(public)方法调用,对吗?
/* 1 */ pointcut services() : call(public * *(..))
现在,这个怎么样:
/* 2 */ pointcut services() : call(public * Server.*(..))
我假设在调用 Server 对象的公共(public)方法时会拦截任何点。
现在,我如何从这里到达初始示例 0?我该如何阅读?
在构建切入点时,您会先提供参数列表吗?
/* 3a */ pointcut services(Server s) : call(public * *(..))
这与上面的数字 2 相同吗? (我觉得它不会起作用,如果它起作用,它会“拦截”每个公共(public)方法调用,就像数字 1 一样。)不管怎样,下面是一样的吗? (我还没有用原生切入点“捕获”s
,所以我不能真正定义它,对吗?)
/* 4a */ pointcut services(Server /* only type, no variable */) : call(public * *(..))
或者您会先指定一个本地切入点,以“捕获”目标对象,如下所示:
/* 3b */ pointcut services() : target(s) && call(public * *(..))
我想这仍然会拦截对任何对象的所有公共(public)方法调用吗?
下面的工作是否只拦截对服务器对象的调用,并“捕获”该对象(而不使其可用于以后传递,例如通知)?
/* 5 */ pointcut services(/*nothing here*/) : target(s) && call(public * Server.*(..))
现在,回到最初的切入点:
/* 0 */ pointcut services(Server s): target(s) && call(public * *(..))
是不是一样
/* 6 */ pointcut services(Server s): target(s) && call(public * Server.*(..))
所以,总结一下:你如何开始破译 0?
您是否首先查看target
切入点,然后查看services
切入点的参数类型并“从里到外”/“从右到左”阅读它?还是先查看参数列表,然后查看 services
切入点以查看参数来自何处(即 target(s)
)?
还是我把它弄得太复杂了?我是否遗漏了重要的一点来帮助我理解这一点?
编辑: 手册从左到右对其进行了解释 - 但是如果我没有“执行”target,参数
了吗?Server s
的参数从哪里来(s)
最佳答案
1:是的,它会拦截任何公共(public)方法调用。
2:它拦截对声明作为服务器
的对象的任何公共(public)方法调用,而0拦截对作为实例的对象的任何公共(public)调用>服务器
。参见 the semantics .
3a: 由于 s
未绑定(bind),因此无法编译:
[ERROR] formal unbound in pointcut
.../src/main/aspect/MyAspect.aj:18
pointcut services(Server s): call(public * *(..));
4a: 语法无效,就像在接口(interface)中声明方法时需要命名参数一样:
[ERROR] Syntax error, insert "... VariableDeclaratorId" to complete FormalParameterList
.../src/main/aspect/MyAspect.aj:18
pointcut services(Server): call(public * *(..));
^
3b: 也是无效的,s
还没有声明:
[WARNING] no match for this type name: s [Xlint:invalidAbsoluteTypeName]
.../src/main/aspect/MyAspect.aj:18
pointcut services(): target(s) && call(public * *(..));
5: 和 3b 一样,s
还没有声明。
6:与0不同,它只匹配公共(public)Server
方法调用(即在Server
中声明)到一个服务器
实例。
我在 a Github repository 中说明了不同的情况。 :在分支之间切换以尝试它们。在 aspect7 分支中有一个额外的案例,基于 6,我在 Server
中覆盖了 hashCode()
。
您可以(并且应该)自己尝试,以获得更好的理解。
为了回答您的最后一个问题,切入点的参数来自于我们希望(能够)通过将其作为参数提供给建议来访问建议中调用的目标这一事实。通知的签名需要包含所有引用的切入点的参数,切入点参数需要引用通知中的参数。
因此,要在建议中有一个 Server
参数,我需要在切入点中使用它,并且需要将它绑定(bind)到切入点定义中的某些内容。
关于java - 阅读和理解 AspectJ 切入点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28969333/
我正在尝试读取一个大型日志文件,该文件已使用不同的分隔符(遗留更改)进行了解析。 此代码有效 import os, subprocess, time, re import pandas as pd f
我试图理解在 Linux 下以 Turbo 模式(特别是 fpc -Mtp -vw)编译的 Free Pascal 中看到的有点神奇的行为。代码来自 Jack Crenshaw 的“让我们构建一个编译
我有一个具有以下结构的 txt 文件: NAME DATA1 DATA2 a 10 1,2,3 b 6 8,9 c 2
我试图理解在 Linux 下以 Turbo 模式(特别是 fpc -Mtp -vw)编译的 Free Pascal 中看到的有点神奇的行为。代码来自 Jack Crenshaw 的“让我们构建一个编译
public class Bug1 { private String s; public void Bug1(){ s = "hello"; } public Stri
我们有这样一种情况,我们的应用程序需要处理一系列文件,而不是同步执行此功能,我们希望采用多线程将工作负载分配给不同的线程。 每一项工作是: 1.以只读方式打开文件 2.处理文件中的数据 3.将处理后的
我正在尝试读取 .php 文件并替换十六进制字符。php文件格式如下: 问题是它弄乱了转义字符 (\") 到目前为止我的代码: while(i=48 && str[i+2]=97 && str[i+
我正在用 C# 开发一个程序,我需要一些帮助。我正在尝试创建一个数组或项目列表,显示在某个网站上。我想要做的是阅读 anchor 文本,它是 href。例如,这是 HTML:
我有一个偏好设置,它控制我的应用程序是否在用户单击按钮时播放声音(这种情况经常发生,想想计算器)。每次用户单击按钮时,都会调用以下方法: private void playButtonClickSou
我正在尝试在我的标签末尾创建一个阅读更多按钮。我希望它默认显示 3 行。我正在用 swift 而不是 objective c 编写代码。只有当用户点击标签的阅读更多部分时,标签才会展开。它的外观和工作
当您获得第三方库(c、c++)、开源(LGPL 说)但没有很好的文档时,了解它以便能够集成到您的应用程序中的最佳方法是什么? 该库通常有一些示例程序,我最终使用 gdb 浏览了代码。还有其他建议/最佳
同时从 2 个或更多不同线程对同一个文件描述符使用 pread 是否有问题? 最佳答案 pread 本身是线程安全的,因为它不在 list of unsafe functions 上.所以调用它是安全
当您使用命令 pd.read_csv 读取 csv 时,如何跳过连续包含特定值的行?如果在第 50、55 行,第一列的值为 100,那么我想在读取 csv 文件时跳过这些行。我如何将这些命令放入像 p
我迫切需要在 C# 中使用 T4 生成 HTML 输出。 我正在使用 Runtime-T4-Files 并选择“TextTemplatingFilePreprocessor”而不是“TextTempl
今年夏天我在实习期间一直在学习 ERP 应用程序。由于我是一名即将毕业的程序员,我希望有一个可靠的软件分支可以帮助我完成工作,直到我确定下一步该做什么(直到我对大局有一个很好的了解)。到现在为止,我刚
将包含列(例如“a”、“b”)的数据帧保存为 parquet,然后在稍后的时间点读取 parquet 不会提供相同的列顺序(可能是“b”、“a”fe)文件保存为。 不幸的是,我无法弄清楚订单是如何受到
我正在开发一个使用谷歌表格作为数据库的应用程序,但我不知道如何让 Swift 从谷歌表格中读取。我浏览了 API 网站和一些问题,但刚开始我需要一些帮助。到目前为止,我有; 私有(private)让范
我打算阅读swing concept,如果值得一读,请推荐一些学习 Material 最佳答案 自 AWT 崩溃以来,Java 的 GUI 工具包太多了。即使是 Swing 也被评论家严重低估,但他们
我已经使用 J 几个月了,我发现阅读不熟悉的代码(例如,不是我自己写的)是该语言最具挑战性的方面之一,尤其是在默认情况下。过了一会儿,我想出了这个策略: 1)将代码段复制到word文档中 2)从(1)
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!