View MethodDelegation.java
private static AgentBuilder createAgent(Class<? extends Annotation> annotationType, | |
String methodName) { | |
return new AgentBuilder.Default().type( | |
ElementMatchers.isAnnotatedWith(annotationType)).transform( | |
new AgentBuilder.Transformer() { | |
@Override | |
public DynamicType.Builder<?> transform( | |
DynamicType.Builder<?> builder, | |
TypeDescription typeDescription, | |
ClassLoader classLoader) { |
View HelloController.java
@RestController | |
public class HelloController { | |
private static final String template = "Hello, %s!"; | |
@RequestMapping("/hello") | |
public String greeting( | |
@RequestParam(value = "name", defaultValue = "World") String name) { | |
return String.format(template, name); | |
} |
View LoggingInterceptor.java
public static void intercept(@AllArguments Object[] allArguments, | |
@Origin Method method) { | |
Logger logger = LoggerFactory.getLogger(method.getDeclaringClass()); | |
logger.info("Method {} of class {} called", method.getName(), method | |
.getDeclaringClass().getSimpleName()); | |
for (Object argument : allArguments) { | |
logger.info("Method {}, parameter type {}, value={}", | |
method.getName(), argument.getClass().getSimpleName(), | |
argument.toString()); |
View MatchingToAnnotation.java
type(ElementMatchers.isAnnotatedWith(RestController.class)) |
View MatchingToClassName.java
type(ElementMatchers.named( | |
"pl.halun.demo.bytebuddy.instrumented.app.HelloController")) |
View DependencyLogback.xml
<dependency> | |
<groupId>ch.qos.logback</groupId> | |
<artifactId>logback-classic</artifactId> | |
<version>1.1.7</version> | |
<scope>provided</scope> | |
</dependency> |
View JavaAgentByteBuddyFinal.java
return new AgentBuilder.Default().disableClassFormatChanges() | |
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) | |
.type(named(className)) | |
.transform(new AgentBuilder.Transformer() { | |
@Override | |
public DynamicType.Builder<?> transform( | |
DynamicType.Builder<?> builder, TypeDescription typeDescription, | |
ClassLoader classLoader) { | |
return builder.visit(Advice.to(LoggingAdvice.class).on( |
View LoggingAdvice.java
public class LoggingAdvice { | |
@Advice.OnMethodEnter | |
public static void intercept(@Advice.BoxedArguments Object[] allArguments, | |
@Advice.Origin Method method) { | |
Logger logger = LoggerFactory.getLogger(method.getDeclaringClass()); | |
logger.info("Method {} of class {} called", method.getName(), method | |
.getDeclaringClass().getSimpleName()); | |
for (Object argument : allArguments) { | |
logger.info("Method {}, parameter type {}, value={}", |