import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public abstract class JdkProxyFactoryUtils {
public static Object wrap(InvocationHandlerWrapper hander) {
Class<?> clazz = hander.getBean().getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),
clazz.getInterfaces(), hander);
}
} import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public abstract class InvocationHandlerWrapper implements InvocationHandler {
private Object object = null;
public InvocationHandlerWrapper(Object object) {
super();
this.object = object;
}
public Object getBean() {
return object;
}
abstract public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
测试代码,定义一个过滤器,对HttpServletRequest和HttpServletResponse包装,实现输出调用的方法的名称。
package com.mvc.filter;import java.io.IOException;
import java.lang.reflect.Method;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.mvc.common.InvocationHandlerWrapper;
import com.mvc.common.JdkProxyFactoryUtils;public class ProxyFilter implements Filter { @Override
public void destroy() { } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
HttpServletRequest httpServletRequestWrapper = (HttpServletRequest) JdkProxyFactoryUtils
.wrap(new InvocationHandlerWrapper(req) {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
Object result = method.invoke(this.getBean(), args);
System.out.println(method.getName());
return result;
}
});
HttpServletResponse httpServletResponseWrapper = (HttpServletResponse) JdkProxyFactoryUtils
.wrap(new InvocationHandlerWrapper(resp) {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
Object result = method.invoke(this.getBean(), args);
System.out.println(method.getName());
return result;
}
});
chain.doFilter(httpServletRequestWrapper, httpServletResponseWrapper);
} @Override
public void init(FilterConfig arg0) throws ServletException { }}
import java.lang.reflect.Proxy;
public abstract class JdkProxyFactoryUtils {
public static Object wrap(InvocationHandlerWrapper hander) {
Class<?> clazz = hander.getBean().getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),
clazz.getInterfaces(), hander);
}
} import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public abstract class InvocationHandlerWrapper implements InvocationHandler {
private Object object = null;
public InvocationHandlerWrapper(Object object) {
super();
this.object = object;
}
public Object getBean() {
return object;
}
abstract public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
测试代码,定义一个过滤器,对HttpServletRequest和HttpServletResponse包装,实现输出调用的方法的名称。
package com.mvc.filter;import java.io.IOException;
import java.lang.reflect.Method;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.mvc.common.InvocationHandlerWrapper;
import com.mvc.common.JdkProxyFactoryUtils;public class ProxyFilter implements Filter { @Override
public void destroy() { } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
HttpServletRequest httpServletRequestWrapper = (HttpServletRequest) JdkProxyFactoryUtils
.wrap(new InvocationHandlerWrapper(req) {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
Object result = method.invoke(this.getBean(), args);
System.out.println(method.getName());
return result;
}
});
HttpServletResponse httpServletResponseWrapper = (HttpServletResponse) JdkProxyFactoryUtils
.wrap(new InvocationHandlerWrapper(resp) {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
Object result = method.invoke(this.getBean(), args);
System.out.println(method.getName());
return result;
}
});
chain.doFilter(httpServletRequestWrapper, httpServletResponseWrapper);
} @Override
public void init(FilterConfig arg0) throws ServletException { }}
import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public abstract class MethodInterceptorHander implements MethodInterceptor {
private Object bean = null; public MethodInterceptorHander(Object bean) {
super();
this.bean = bean;
} public Object getBean() {
return bean;
} public abstract Object intercept(Object object, Method method,
Object[] objects, MethodProxy methodProxy) throws Throwable;
}package com.mvc.common;import net.sf.cglib.proxy.Enhancer;public abstract class CGLIBProxyFactoryUtils { public static Object wrap(MethodInterceptorHander hander) {
Object obj = null;
Class<?> clazz = null;
try {
clazz = hander.getBean().getClass();
Enhancer e = new Enhancer();
e.setSuperclass(clazz);
e.setCallback(hander);
obj = e.create();
} catch (Throwable e) {
e.printStackTrace();
}
return obj;
} public static Object wrap(MethodInterceptorHander hander,
Class<?>[] argmentTypes, Object[] argments) {
Object obj = null;
Class<?> clazz = null;
try {
clazz = hander.getBean().getClass();
Enhancer e = new Enhancer();
e.setSuperclass(clazz);
e.setCallback(hander);
obj = e.create(argmentTypes, argments);
} catch (Throwable e) {
e.printStackTrace();
}
return obj;
}
}
如果我是你leader我会让你重新写。