ClassLoader classLoader = targetObject.getClass().getClassLoader();
Class<?>[] interfaces = targetObject.getClass().getInterfaces();
DynamicType.Unloaded<?> dynamicType = new ByteBuddy()
.subclass(targetObject.getClass())
.implement(interfaces)
.method(any())
.intercept(MethodDelegation.to(targetObject))
.make();
Class<? extends MyClass> proxyClass = dynamicType.load(classLoader)
.getLoaded();
Instrumentation instrumentation = ByteBuddyAgent.install();
instrumentation.addTransformer(
(loader, className, classBeingRedefined, protectionDomain, classfileBuffer) -> {
if (className.equals(targetClassName)) {
return dynamicTypeBytes;
}
return null;
}
);
instrumentation.retransformClasses(targetClass);
public class MyInterceptor {
@RuntimeType
public static Object intercept(@Origin Method method,
@SuperCall Callable<?> callable) throws Exception {
System.out.println("Before method call");
try {
return callable.call();
} finally {
System.out.println("After method call");
}
}
}