Skip to content

Instantly share code, notes, and snippets.

@jakubhalun
jakubhalun / HelloController.java
Created October 9, 2017 19:15
RestController for Byte Buddy instrumentation demo
@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);
}
@jakubhalun
jakubhalun / LoggingInterceptor.java
Created October 9, 2017 19:16
Interceptor logs method execution and its parameters
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());
@jakubhalun
jakubhalun / MatchingToAnnotation.java
Created October 9, 2017 19:18
Byte Buddy: matching the class by its annotation
type(ElementMatchers.isAnnotatedWith(RestController.class))
@jakubhalun
jakubhalun / MatchingToClassName.java
Created October 9, 2017 19:19
Byte Buddy matching to a class name
type(ElementMatchers.named(
"pl.halun.demo.bytebuddy.instrumented.app.HelloController"))
@jakubhalun
jakubhalun / DependencyLogback.xml
Created October 9, 2017 19:20
Dependency to Logback Classic
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
<scope>provided</scope>
</dependency>
@jakubhalun
jakubhalun / JavaAgentByteBuddyFinal.java
Created October 9, 2017 19:22
Byte Buddy Java Agent working both from command line parameter and Attach API
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(
@jakubhalun
jakubhalun / LoggingAdvice.java
Created October 9, 2017 19:23
Logging interceptor as Advice
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={}",
@jakubhalun
jakubhalun / MethodDelegation.java
Created October 9, 2017 19:13
Byte Buddy Java Agent with method delegation to interceptor
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) {