在上个版本中,简单实现了代理模式。最近下去重新编写了一下代码,将其制作成了一套工具。话不多说,贴代码:
/*
* @auther yc
* 2018/10/12
*/
package com.mec.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public abstract class YcProxy {
public YcProxy() {
}
public <T> T CGLProxy(Class<?> klass) throws Exception {
Object object = klass.newInstance();
return getCGLProxy(klass, object);
}
public <T> T CGLProxy(Object object) {
Class<?> klass = object.getClass();
return getCGLProxy(klass, object);
}
@SuppressWarnings("unchecked")
private <T> T getCGLProxy(Class<?> klass, Object object) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(klass);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
return IntercepterInvoke(object, method, args);
}
});
return (T) enhancer.create();
}
public <T> T JDkProxy(Class<?> klass) throws Exception {
Object object = klass.newInstance();
return getJDKProxy(klass, object);
}
public <T> T JDKProxy(Object object) {
Class<?> klass = object.getClass();
return getJDKProxy(klass, object);
}
@SuppressWarnings("unchecked")
private <T> T getJDKProxy(Class<?> klass, Object object) {
return (T) Proxy.newProxyInstance(klass.getClassLoader(), klass.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return IntercepterInvoke(object, method, args);
}
});
}
private Object IntercepterInvoke(Object object, Method method, Object[] args) {
Object result = null;
try {
// 置前拦截
before(object, method, args);
result = method.invoke(object, args);
// 滞后拦截
after(object, method, args);
} catch (Exception e) {
// 异常拦截
dealException(object, method, args);
}
return result;
}
public abstract void before(Object object, Method method, Object[] args);
public abstract void after(Object object, Method method, Object[] args);
public abstract void dealException(Object object, Method method, Object[] args);
}