看了 @wanglei0622 的文章 动态代理实现 介绍了 JDK 提供的方法,个人用 CGLib 比较多,所以补充一下 CGLib 的动态代理实现,如果有错误,还请指出修正。
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* Created by CR on 2016/5/6.
*/
public class LogHandler implements MethodInterceptor {
private static LogHandler instance = new LogHandler();
private LogHandler(){
}
public static LogHandler getInstance(){
return instance;
}
public <T> T getProxy(Class<T> cls) {
return (T) Enhancer.create(cls, this);
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
doBefore();
Object result = methodProxy.invokeSuper(o, objects);
doAfter();
return result;
}
private void doBefore(){
System.out.println("do something before");
}
private void doAfter(){
System.out.println("do something after");
}
public static void main(String[] args) {
Eat proxy = LogHandler.getInstance().getProxy(Dog.class);
proxy.eat();
}
}
优势是,没有接口的类,也可以代理。 Proxy.newProxyInstance 这个方法的参数也让人醉了
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于