我正在尝试在基于 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 集成了吗?
我会很感激任何帮助,谢谢。