我想做一些扩展的类
JPanel
实际上在其间扩展了我自己的一个类。
所以,我尝试了这个:
public aspect MyAspect
{
public static class MyPanel
extends JPanel
{
}
declare parents: JPanel+ extends MyPanel;
}
照原样,它有效。唯一的问题是该方面与任何扩展
JPanel
的类相匹配,而我希望它仅适用于包中的 JPanel+
类。
所以我尝试了这个:
public aspect MyAspect
{
public static class MyPanel
extends JPanel
{
}
declare parents: my.package..JPanel+ extends MyPanel;
}
而且它根本不匹配任何
JPanel+
...
另一方面,我尝试在
JPanel+
的包中显式定位特定的 my.package..
类,并且它适用于该特定类,因此 AspectJ 可以理解包路径。
我只是不明白为什么它不能与
my.package..JPanel+
一起使用?
只是 my.package..JPanel
(没有 +)是可以理解的,因为那里不存在 JPanel
,但为什么 my.package..JPanel+
不能按预期工作(对我来说!)?
顺便说一句,
my.package..*_suffixFilterOnClassName
确实有效,但在我看来确实不太理想。
从https://eclipse.dev/aspectj/doc/released/adk15notebook/annotations-decp.html,我知道我可以使用注释作为解决方法,但它也不是那么好。但它比仅仅后缀过滤要好。
此外,如果切入点+声明警告+错误中的 inside/withincode 等常用语法能够像其他切入点一样工作,那就太好了,但据我所知,
declare parents
仅使用 TypePattern 实现!
预先感谢您的帮助!
目前仅使用
declare parents
无法实现您想要的效果,但有一个解决方法,请参见下文。 my.package..JPanel+
表示在 JPanel
中的某个位置查找 my.package
的子类,而该位置不是 JPanel
所在的位置。所以切入点根本就是错误的。您也不能将切入点与 within(my.package..*)
之类的东西结合起来,而只能使用您已经发现的命名模式。
但是,有一个未记录的 ajc 编译器参数
-xmlConfigured
,AspectJ Maven Plugin 也支持该参数,请参阅 here 了解详细信息。
我已在旧的
AspectJ Bugzilla 问题 455014中记录了我所知道的所有信息。请随意阅读全文,并滚动到底部以获取旧 URL 下不再可用的邮件列表帖子的更新链接。 您特别需要的是
aop.xml 中的方面范围界定(只需在页面底部按 Ctrl-F 搜索“范围”即可获取后续信息)。 也就是说,像你原来的
-xmlConfigured
与编译器开关的组合以及
aop.xml中的类似内容应该可以完成这项工作:
declare parents: JPanel+ extends MyPanel