/** @author Jongho Moon */
public class BeanMethodTransformer implements PinpointClassFileTransformer {
  private static final int REQUIRED_ACCESS_FLAG = Modifier.PUBLIC;
  private static final int REJECTED_ACCESS_FLAG =
      Modifier.ABSTRACT | Modifier.NATIVE | Modifier.STATIC;
  private static final MethodFilter METHOD_FILTER =
      MethodFilters.modifier(REQUIRED_ACCESS_FLAG, REJECTED_ACCESS_FLAG);

  private final PLogger logger = PLoggerFactory.getLogger(getClass());

  /* (non-Javadoc)
   * @see com.navercorp.pinpoint.bootstrap.plugin.transformer.PinpointClassFileTransformer#transform(com.navercorp.pinpoint.bootstrap.plugin.PinpointInstrument, java.lang.ClassLoader, java.lang.String, java.lang.Class, java.security.ProtectionDomain, byte[])
   */
  @Override
  public byte[] transform(
      Instrumentor instrumentContext,
      ClassLoader loader,
      String className,
      Class<?> classBeingRedefined,
      ProtectionDomain protectionDomain,
      byte[] classfileBuffer)
      throws InstrumentException {
    if (logger.isInfoEnabled()) {
      logger.info("Modify {}", className);
    }

    try {
      InstrumentClass target =
          instrumentContext.getInstrumentClass(loader, className, classfileBuffer);

      if (!target.isInterceptable()) {
        return null;
      }

      List<InstrumentMethod> methodList = target.getDeclaredMethods(METHOD_FILTER);
      for (InstrumentMethod method : methodList) {
        if (logger.isTraceEnabled()) {
          logger.trace(
              "### c={}, m={}, params={}",
              new Object[] {
                className, method.getName(), Arrays.toString(method.getParameterTypes())
              });
        }

        method.addInterceptor(
            BasicMethodInterceptor.class.getName(), va(SpringBeansConstants.SERVICE_TYPE));
      }

      return target.toBytecode();
    } catch (Exception e) {
      logger.warn("modify fail. Cause:{}", e.getMessage(), e);
      return null;
    }
  }
}
示例#2
0
  private void addInterceptorsForClasses(ServiceType serviceType, String... targetClassNames) {

    final MethodFilter methodFilter =
        MethodFilters.name(
            "insert",
            "delete",
            "update",
            "queryForList",
            "queryForMap",
            "queryForObject",
            "queryForPaginatedList");
    for (String targetClassName : targetClassNames) {
      addInterceptorsForClass(targetClassName, serviceType, methodFilter);
    }
  }