/** @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; } } }
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); } }