我正在尝试在基于 AndroidAnnotations 的项目中使用ByteBuddy。
我有一个具有一些注入依赖项MyService的(AA)类:EBean
@EBean
public class MyService {
@Bean
SomeRepository repo;
@Log
public void doSomething() { //do something that uses "repo" }
}
我想在执行这个类的任何方法之前记录一些东西,用@Log.
我可以获得MyService这种方式的新实例:
MyService service = MyService_.getInstance(context); //MyService_ is generated by AndroidAnnotations
并且所有@Bean依赖项都被注入。一切还好。
现在,使用 ByteBuddy,我需要创建一个动态子类来拦截带注释的方法:
Class<? extends MyService> dynamic = byteBuddy
.subclass(MyService_.class)
.method(ElementMatchers.isAnnotatedWith(Log.class))
.intercept(MethodDelegation.to(new LogInterceptor()))
.make()
.load(getClassLoader(), new AndroidClassLoadingStrategy(getDir()))
.getLoaded();
我需要子类MyService_而不是MyService因为它使用Context注入依赖项。如果我要子类化MyService,repo将永远是null。
问题是自动生成的类MyService_是final,所以我不能子类化它。getInstance方法是静态的,构造函数是私有的,但我可以通过反射获得一个实例,所以这不是问题。
任何想法?有人将 ByteBuddy 与 AndroidAnnotations 集成了吗?
我会很感激任何帮助,谢谢。