【问题标题】:How is guice AOP implemented?guice AOP是如何实现的?
【发布时间】:2020-01-29 18:29:04
【问题描述】:

我在此处的文档中阅读了有关 guice AOP 的信息:- https://github.com/google/guice/wiki/AOP 从文档中:-

在幕后,方法拦截是通过在运行时生成字节码来实现的。 Guice 通过重写方法动态创建一个应用拦截器的子类。如果您使用的平台不支持字节码生成(例如 Android),则应使用不支持 AOP 的 Guice。

文档通过扩展子类意味着什么。这是方法拦截器的子类吗?它是否通过使用反射拦截方法来工作?我问这个问题的原因是因为在文档中,这一行后面跟着这个:-

因此,我们对 guice AOP 有以下限制

a) AOP 不能应用于私有方法。

我不清楚为什么 AOP 不能应用于私有方法。

【问题讨论】:

    标签: aop guice


    【解决方案1】:

    我不清楚为什么 AOP 不能应用于私有方法。

    因为私有方法不被子类继承,即无法拦截私有方法然后委托给它,因为子类甚至不能调用该方法。这是一个正常的 Java 限制,与 AOP 无关。

    顺便说一句,如果您想要一个成熟、强大的 AOP 工具,可以与任何 JVM 语言一起使用,并且能够拦截私有方法而无需求助于动态代理(在运行时创建的子类,如 Guice 或 Spring AOP),只需使用 AspectJ .

    文档通过扩展子类意味着什么。

    JRE 知道dynamic proxies 的概念,以便能够拦截方法调用并(可选地)在拦截器方法中执行其他操作之前/之后委托给原始调用。这仅适用于接口,但 CGLIB 将此概念扩展到非接口类的子类,这就是为什么在基于代理的 AOP 框架中,例如 Spring AOP(也许是 Guice,不是 100% 确定)使用代理来实现 AOP . AspectJ 的工作方式不同,它不使用或不需要任何动态代理或其他类型的子类。

    【讨论】:

    • 非常感谢。只是为了确认我的理解,guice 会动态创建一个子类,对其应用动态代理,然后该子类将调用实际方法?
    • 动态代理子类。也许 Spring 手册中的 this chapter 可以帮助您更好地理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2012-02-11
    • 2015-10-09
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多