看了 @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 这个方法的参数也让人醉了
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于