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

com.alibaba.jvm.sandbox.api.filter.Filter的doMethodFilter方法API #425

Closed hengyoush closed 2 months ago

hengyoush commented 1 year ago

com.alibaba.jvm.sandbox.api.filter.Filter这个类的目的是过滤增强的类和接口,然而doMethodFilter方法却没有方法所属类的信息,导致有时候想根据方法所在类做一些判断都不行。 按照注释里说的:严格意义上来说,该方法被调用的时候,一定是{@link Filter#doClassFilter(int, String, String, String[], String[])}上一次返回true的调用。所以可以通过简单的引用就可以在doMethodFilter执行的时候拿到doClassFilter的信息, 但是仍然很难用,希望能在doMethodFilter里带上类相关信息。

public interface Filter {

    /**
     * 过滤出匹配的类
     *
     * @param access                           access flag
     * @param javaClassName                    类名(全路径名称)
     * @param superClassTypeJavaClassName      父类(全路径名称)
     * @param interfaceTypeJavaClassNameArray  接口类型名称数组
     * @param annotationTypeJavaClassNameArray 标注原数据类型名称数组(注意,此参数尚未支持,只是预留一个API占位)
     * @return true:匹配;false:不匹配;
     */
    boolean doClassFilter(int access,
                          String javaClassName,
                          String superClassTypeJavaClassName,
                          String[] interfaceTypeJavaClassNameArray,
                          String[] annotationTypeJavaClassNameArray);

    /**
     * 过滤出匹配的方法
     * <p>
     * 严格意义上来说,该方法被调用的时候,一定是{@link Filter#doClassFilter(int, String, String, String[], String[])}上一次返回true的调用。
     * 所以可以通过简单的引用就可以在doMethodFilter执行的时候拿到doClassFilter的信息
     * </p>
     * <p>如果你需要综合对Class和Method做一个拉平之后的综合判断,可以考虑使用{@link OrGroupFilter}来实现</p>
     *
     * @param access                           access flag
     * @param javaMethodName                   方法名称(包括类名称,静态方法名,普通方法名和构造函数)
     * @param parameterTypeJavaClassNameArray  参数类型名称数组
     * @param throwsTypeJavaClassNameArray     声明异常类型名称数组
     * @param annotationTypeJavaClassNameArray 标注原数据类型名称数组(注意,此参数尚未支持,只是预留一个API占位)
     * @return true:匹配;false:不匹配
     */
    boolean doMethodFilter(int access,
                           String javaMethodName,
                           String[] parameterTypeJavaClassNameArray,
                           String[] throwsTypeJavaClassNameArray,
                           String[] annotationTypeJavaClassNameArray);

}
oldmanpushcart commented 1 year ago

嗯,确实可以,目前我们很少直接用Filter。你可以自己封装下,我也很欢迎你能提交这个PR。