JDK Dynamic Proxies - Intercept method calls using dynamic Proxy
Ref : https://www.logicbig.com/tutorials/core-java-tutorial/java-dynamic-proxies/method-interceptors.html
Step 1:
2. Another example
Step 1:
public class MyInvocationHandler implements InvocationHandler {
private String theString;
public MyInvocationHandler (String theString) {
this.theString = theString;
}
@Override
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before method call : " + method.getName());
Object result = method.invoke(theString, args);
System.out.println("after method call : " + method.getName());
return result;
}
Step 2: public class MyInterceptor<T> implements InvocationHandler {
private T t;
public MyInterceptor(T t) {
this.t = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before method call : " + method.getName());
Object result = method.invoke(t, args);
System.out.println("after method call : " + method.getName());
return result;
}
@SuppressWarnings("unchecked")
public static <T> T getProxy(T t, Class<? super T> interfaceType) {
MyInterceptor handler = new MyInterceptor(t);
return (T) Proxy.newProxyInstance(interfaceType.getClassLoader(),
new Class<?>[]{interfaceType}, handler
);
}
}
Step 3: public class MyInterceptorExample {
public static void main(String[] args) {
List<String> list = MyInterceptor.getProxy(new ArrayList<>(), List.class);
list.add("one");
list.add("two");
System.out.println(list);
list.remove("one");
}
}
Outputbefore method call : add after method call : add before method call : add after method call : add before method call : toString after method call : toString [one, two] before method call : remove after method call : remove
2. Another example
public class JdkProxyDemo {
interface If {
void originalMethod(String s);
}
static class Original implements If {
public void originalMethod(String s) {
System.out.println(s);
}
}
static class Handler implements InvocationHandler {
private final If original;
public Handler(If original) {
this.original = original;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException {
System.out.println("BEFORE");
method.invoke(original, args);
System.out.println("AFTER");
return null;
}
}
public static void main(String[] args){
Original original = new Original();
Handler handler = new Handler(original);
If f = (If) Proxy.newProxyInstance(If.class.getClassLoader(),
new Class[] { If.class },
handler);
f.originalMethod("Hallo");
}
}
Comments
Post a Comment