<dependencies>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.27.0-GA</version>
</dependency>
</dependencies>
public interface Foo {
void bar();
void baz();
}
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;
import javassist.util.proxy.ProxyObject;
public class DynamicProxy implements MethodHandler {
private Object target;
public Object bind(Object target) {
this.target = target;
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(target.getClass());
Class<?> proxyClass = factory.createClass();
try {
Object proxyObject = proxyClass.getDeclaredConstructor().newInstance();
((ProxyObject) proxyObject).setHandler(this);
return proxyObject;
} catch (Exception e) {
throw new RuntimeException("Error creating proxy object", e);
}
}
@Override
public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
System.out.println("Before method invocation");
Object result = thisMethod.invoke(target, args);
System.out.println("After method invocation");
return result;
}
}
public class Main {
public static void main(String[] args) {
Foo foo = new DynamicProxy().bind(new FooImpl());
foo.bar();
foo.baz();
}
}
class FooImpl implements Foo {
@Override
public void bar() {
System.out.println("Inside bar() method");
}
@Override
public void baz() {
System.out.println("Inside baz() method");
}
}
Before method invocation
Inside bar() method
After method invocation
Before method invocation
Inside baz() method
After method invocation