JAVA探针开发之方法拦截器与过滤器

使用方法过滤器来设置多个方法的拦截器

      如果需要给一个类中的多个方法添加同一个拦截器,那么可以使用方法过滤器来获得一组方法,不再需要指定每一个方法的名称和参数列表来获取目标方法的InstrumentMethod。例如,一个类中存在多个名称为recordMe,但是参数列表不同的方法,使用方法过滤器来设置目标方法的拦截器可以如下操作:

   for (InstrumentMethod method : instrumentClass.getDeclaredMethods(MethodFilters.name("recordMe"))) {
       method.addInterceptor("com.navercorp.apm.bootstrap.interceptor.BasicMethodInterceptor",
           va(SamplePluginConstants.MY_SERVICE_TYPE));
   }

     使用注解设置过滤器的目标方法

    获取到目标类的InstrumentClass后,可以不用在获取目标方法的InstrumentMethod后再添加拦截器。拦截器的目标方法和Scope可以使用标注在过滤器类上的注解来指定。

给目标类的私有field设置Getter方法

    有时需要在拦截器里使用目标对象的私有field,这时可以通过给目标类注入Getter方法来实现。

    给目标类添加field

    如果出于保存、传递跟踪数据等需要,可以通过给目标类添加field来达成该目标。

    在插件中获取apm参数

ProfilerConfig config = instrumentor.getProfilerConfig();

在插件中定义类,并传递给拦截器

    拦截器是在目标类加载时加载的,拦截器的class loader是目标类的class loader。插件是apm加载的,其class loader是apm的plugin class loader。
    如果在插件中定义一个类X,并且拦截器需要使用X,如果以普通的方法将X传递给拦截器的话,拦截器在加载时会找不到X类的定义。所以,需要使用ObjectFactory来完成上述工作。同理,应该避免使用在插件中定义的类型的静态变量来共享数据。

你可能感兴趣的:(APM)