В принципе перехват @Slf4j
будет таким же, как и для вашей собственной пользовательской аннотации , если (и только если) @Slf4j
все еще будет присутствовать в байт-коде во время выполнения. Но на самом деле это не так. У него SOURCE
срок хранения, как вы можете видеть в исходном коде аннотации .
Справочная информация: аннотация @Slf4j
используется компилятором Groovy для динамического создания статического регистратора во время компиляции, чтобы сохранить вас в качестве стандартного пользовательского кода в ваших классах Groovy. Если вы декомпилируете этот класс ...
package de.scrum_master.stackoverflow
import groovy.util.logging.Slf4j
@Slf4j
class FooBarZot {
void test() {
log.info("test")
}
}
... вы увидите что-то вроде этого:
package de.scrum_master.stackoverflow;
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.callsite.CallSite;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FooBarZot implements GroovyObject {
private static final transient Logger log;
public FooBarZot() {
CallSite[] var1 = $getCallSiteArray();
super();
MetaClass var2 = this.$getStaticMetaClass();
this.metaClass = var2;
}
public void test() {
CallSite[] var1 = $getCallSiteArray();
var1[0].call(log, "test");
}
static {
Object var0 = $getCallSiteArray()[1].call(LoggerFactory.class, "de.scrum_master.stackoverflow.FooBarZot");
log = (Logger)ScriptBytecodeAdapter.castToType(var0, Logger.class);
}
}
Следовательно, AspectJ не поможет вам перехватить аннотацию @Slf4j
только потому, что она не существует во время выполнения. Вам нужно будет найти другой способ достижения того, чего вы хотите. Одним из таких подходов может быть обработка аннотаций, поскольку она выполняется перед компиляцией.