public interface HelloService {
void sayHello(String name);
}
public class HelloServiceImpl implements HelloService {
public void sayHello(String name) {
System.out.println("Hello, " + name + "!");
}
}
public class LoggingInterceptor implements Interceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Before method: " + invocation.getMethod().getName());
Object result = invocation.proceed();
System.out.println("After method: " + invocation.getMethod().getName());
return result;
}
}
public class ProxyFactory {
public static HelloService createProxy(HelloService target, Interceptor interceptor) {
return (HelloService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MethodInvocation invocation = new ReflectiveMethodInvocation(target, method, args);
return interceptor.invoke(invocation);
}
});
}
}
public class App {
public static void main(String[] args) {
HelloService target = new HelloServiceImpl();
Interceptor interceptor = new LoggingInterceptor();
HelloService proxy = ProxyFactory.createProxy(target, interceptor);
proxy.sayHello("Alice");
}
}
Before method: sayHello
Hello, Alice!
After method: sayHello