AspectJ 声明父级 JPanel+

问题描述 投票:0回答:1

我想做一些扩展的类

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 实现!

预先感谢您的帮助!

aspectj parent declare
1个回答
0
投票

目前仅使用

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

© www.soinside.com 2019 - 2024. All rights reserved.