/* 0 */ pointcut services(Server s): target(s) && call(public * *(..))
当服务器对象的公共方法被调用时,这个名为“服务”的切入点会在程序的执行过程中挑出这些点。它还允许任何使用服务切入点的人访问其方法被调用的服务器对象。(摘自https://eclipse.org/aspectj/doc/released/progguide/language-anatomy.html)
我正在试图理解AspectJ的切入点,现在我有点困惑。我的主要问题是:您如何阅读上述切入点,以及如何将其含义“拼凑”在一起?
为了说明我的困惑,让我们试着从头开始:
下面的切入点将拦截对任何对象的所有公共方法调用,对吗?
/* 1 */ pointcut services() : call(public * *(..))
现在,这个怎么样:
/* 2 */ pointcut services() : call(public * Server.*(..))
我假设在调用服务器对象的公共方法时,它将拦截任何点。
现在,我如何从这里开始到最初的示例0?我怎么读呢?
在构建切入点时,您会首先提供参数列表吗?
/* 3a */ pointcut services(Server s) : call(public * *(..))
和上面的数字2一样吗?(我有一种感觉,它不会工作,如果它这样做了,它会拦截每个公共方法调用,就像第一个一样。)不管怎样,下面会一样吗?(我还没有用本机切入点捕获s
,所以我不能真正定义它,是吗?)
/* 4a */ pointcut services(Server /* only type, no variable */) : call(public * *(..))
或者你会从指定一个本机切入点开始,来“捕获”目标对象,就像这样:
/* 3b */ pointcut services() : target(s) && call(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?
您是否先查看目标
切入点,然后查看服务
切入点的参数类型,然后“从内到外”/“从右到左”读取它?或者,您是否先查看参数列表,然后查看服务
切入点以查看参数的来源(即目标
)?
还是我把事情弄得太复杂了?我是否错过了一个重要的地方来帮助我理解这一点?
编辑:手册从左到右解释了它——但是如果我还没有“执行”目标
,参数服务器
的参数从哪里来?
1:是的,它拦截任何公共方法调用。
2:它拦截声明为Server
的对象上的任何公共方法调用,而0拦截作为Server
实例的对象上的任何公共调用。看看语义学。
3a:由于s
未绑定,因此它不会编译:
[ERROR] formal unbound in pointcut
.../src/main/aspect/MyAspect.aj:18
pointcut services(Server s): call(public * *(..));
4a:语法无效,就像在接口中声明方法时需要命名参数一样:
[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不一样,它只匹配公共的Server
方法调用(即在Server
中声明)到一个Server
实例。
我在Github存储库中演示了不同的情况:在分支之间切换以尝试它们。aspect7分支中有一个额外的例子,基于6,我在Server
中重写hashCode()
。
你可以(也应该)尝试一下自己,以获得更好的理解。
为了回答您的最后一个问题,切入点的参数来自这样一个事实,即我们希望(能够)通过将其作为建议的参数提供来访问建议中的调用目标。建议的签名需要包含所有引用切入点的参数,切入点参数需要引用建议中的参数。
因此,要在建议中包含一个Server
参数,我需要它在切入点中,并且它需要绑定到切入点定义中的内容。
本 repo 为《深入理解 Java 虚拟机 第2版》的阅读笔记,并对全书内容按照自己的理解进行了一定程度的整理。
问题内容: 例如,我得到了这样的堆栈跟踪: 那么,此异常的根本原因是什么?从堆栈跟踪中,我发现类中的函数存在问题!但是,当我在此处放置一个断点时,程序永远不会在该断点处停止。 谁能给这个解释!在一般情况下,我应该如何使用该堆栈情况进行调试(从下至上或从上至下读取)! 问题答案: 通常,确切的原因在堆栈跟踪的第一行,有关该异常原因的更多信息,你需要逐步向下移动,并且根本原因通常可以在堆栈跟踪底部的某
例如,我得到了一个堆栈跟踪,如下所示: 那么这个异常的根本原因是什么呢?从堆栈跟踪中,我发现类中的函数存在问题!然而,当我把一个断点放在那里,程序永远不会停在那个断点上。 有人能解释一下吗?在一般情况下,我应该如何使用堆栈进行调试(从下到上读或从上到下读)!
我有以下代码: 我只想模拟这些行,并在,因为我将有多个测试用例,具体取决于行(文件为空,行为空,我只得到一行,我得到几行,等等)。 注意:我使用库访问FTP服务器上的文件,因此方法将作为返回类型,而具有。 我正在使用junit 4.12和mockito 3.1.0 提前感谢!
第一个问题是关于三色标记的问题。 jvm 的 原始快照,如果一个黑色对象关联到一个新的白色对象。这个对象并不是从灰色对象逃脱的。不是也一样会产生对象消失吗?为什么说必须满足两个条件才会出现对象消失的问题。这样一样会导致不该被回收的标记为白色。 第二个是关于卡表和记忆集的问题。 卡表中变脏的卡页会加入GC Root ,是将整个卡页的对象加入GC Root 还是通过某种方式,筛选出卡页中有跨代引用的对
问题内容: 考虑以下linux内核转储堆栈跟踪,您可以通过调用从内核源代码触发恐慌: 在什么主张? 我怎么看C的C代码? 如何解释恐慌的内容? 问题答案: 这只是一个普通的回溯,这些函数以相反的顺序调用(第一个调用的函数由上一个调用,依此类推): 该是符号+偏移/长度有关于更多的信息,了解内核哎呀,以及如何可以调试内核哎呀。还有关于调试内核的出色教程 注意:按照Eugene的建议,您可能要先尝试a