使用ByteBuddy和AndroidAnnotations

时间:2016-01-08 07:43:07

标签: java android android-annotations byte-buddy

我正在尝试在基于AndroidAnnotations的项目中使用ByteBuddy

我有一个类MyService,它是EBean(AA),带有一些注入的依赖项:

@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集成在一起?

感谢您的帮助,谢谢。

0 个答案:

没有答案