alibaba / jvm-sandbox

Real - time non-invasive AOP framework container based on JVM
GNU Lesser General Public License v3.0
6.69k stars 1.55k forks source link

切面如果想知道Advice的方法签名,开销有点大 #426

Open XHao opened 1 year ago

XHao commented 1 year ago

构造Advice时,虽然用到了lazyGet,避免了一些开销;但如果用户在切面需要用到方法名做判断,则还是会进行初始化。 仅仅为了获得方法签名,还需要进行一次loadClass,这个开销有点大,高并发时会有锁竞争问题。 https://github.com/alibaba/jvm-sandbox/blob/c01c28ab5d7d97a64071a2aca261804c47a5347e/sandbox-api/src/main/java/com/alibaba/jvm/sandbox/api/listener/ext/AdviceAdapterListener.java#L66

oldmanpushcart commented 1 year ago

收到,确实会有额外的开销。我考虑下如何修改。 不过高并发场景下,不推荐用AdviceListener,可否用EventListener来满足你的诉求?

oldmanpushcart commented 1 year ago

@XHao 我在Advice上新增了3个方法,你看是否能满足你当前需求

    /**
     * 获取触发调用事件的类名称
     *
     * @return 触发调用事件的类名称
     * @since {@code sandbox-api:1.4.1}
     */
    public String getJavaClassName() {
        return javaClassName;
    }

    /**
     * 获取触发调用事件的方法名称
     *
     * @return 触发调用事件的方法名称
     * @since {@code sandbox-api:1.4.1}
     */
    public String getJavaMethodName() {
        return javaMethodName;
    }

    /**
     * 获取触发调用事件的方法签名
     *
     * @return 触发调用事件的方法签名
     * @since {@code sandbox-api:1.4.1}
     */
    public String getJavaMethodDesc() {
        return javaMethodDesc;
    }
XHao commented 1 year ago

@XHao 我在Advice上新增了3个方法,你看是否能满足你当前需求

    /**
     * 获取触发调用事件的类名称
     *
     * @return 触发调用事件的类名称
     * @since {@code sandbox-api:1.4.1}
     */
    public String getJavaClassName() {
        return javaClassName;
    }

    /**
     * 获取触发调用事件的方法名称
     *
     * @return 触发调用事件的方法名称
     * @since {@code sandbox-api:1.4.1}
     */
    public String getJavaMethodName() {
        return javaMethodName;
    }

    /**
     * 获取触发调用事件的方法签名
     *
     * @return 触发调用事件的方法签名
     * @since {@code sandbox-api:1.4.1}
     */
    public String getJavaMethodDesc() {
        return javaMethodDesc;
    }

可以的,我本地也是加了类似的API。感谢!