作为
新罕布什特
已经说过了,
@annotation(my.package.MyAnnotation)
解释了为什么在你的期望值上没有发生任何错误的注释。
如果你想通过AOP找出一个类是否有一个带有特定注释的成员,你需要使用一个特殊的切入点,比如
hasfield(@MyAnnotation * *)
switch to AspectJ
. 如果您想通过
get(@MyAnnotation MyType *)
或
set(@MyAnnotation MyType *)
.
my other answer here
.
-
在类加载后拦截类的静态初始化->
staticinitialization()
-
拦截构造函数执行->
MyType.new()
您可以使用它们来执行方面建议,只要是合适的时候。在您的示例中,您还可以更容易地钩住
@PostConstruct
方法,前提是所有目标类都有其中一个。
我的回答很笼统,因为你没有详细解释你到底想做什么。所以请随时提出后续问题。
:我查看了你最新的问题更新。我不明白,对于一个非常简单的问题,这是一个非常精心设计的解决方案,也不是AOP解决的好案例。尽管我非常喜欢AOP,但我无法理解这种情况是一个跨领域的问题:
-
它似乎只影响一个班级,
InfluxDBReporter
-
-
更糟糕的是,您将注释放在一个私有字段上,但是需要一个外部类(在本例中是一个方面)对它做出反应。虽然这在技术上可以用AspectJ实现,但这是一个糟糕的设计,因为您正在将私有信息泄露给外部。
-
KeySet
即使假设你有更多的公共方法应该被跳过,如果你真的想坚持这种方法,我也会像这样设计AOP解决方案:
-
添加方法
public boolean isConnectedToDB() { return !dbs.isEmpty(); }
-
@Around
建议并从那里调用boolean方法,只调用
joinPoint.proceed()
如果有任何联系。否则不要继续,而是什么也不做
void
方法)或返回一个伪结果,例如
null
(非-
无效
public void
方法或非空方法。
INFLUX_DB_SERVER
但我不知道这是什么,因为我在你的代码中看不到它。
我最不想让你注意到的一件事
@Pointcut
@Before
,
@After
,
@周围
. 您希望执行的操作进入建议,而不是切入点。我建议您在尝试设计基于AOP的解决方案之前先学习AOP基础知识。