实现动态代理的两种方式
第一种使用jdk实现
第二种使用cglib实现
代码写的比较飘逸,娱乐与教学并存。
jdk实现动态代理(接口)
public interface 打架接口 {public void 开打();}
public class 打架 implements 打架接口 {@Overridepublic void 开打() {System.out.println("威哥 打出绝技 降龙十八掌。。。");}}
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class 打架小帮手 implements InvocationHandler{private Object delegate;public Object binder(Object delegate) { this.delegate = delegate; return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this); } @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("小弟们 冲啊。。。");Object invoke = method.invoke(delegate, args);System.out.println("哥在江湖又留下了一段传说。。。");return invoke;}}
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class 威哥 {public static void main(String[] args) {打架接口 打架接口 = (打架接口) new 打架小帮手().binder(new 打架());打架接口.开打();}// 我要去打架// 1 叫上小弟// 2 打架// 3 哥又留下一段传说}
public class 打架 {public void 开打() {System.out.println("威哥 打出绝技 降龙十八掌。。。");}}
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class 打架小帮手 implements MethodInterceptor {@Overridepublic Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("小弟们 冲啊。。。");Object result = methodProxy.invokeSuper(object,args); System.out.println("哥在江湖又留下了一段传说。。。");return result; }public Object createProxy(Class targetClass){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(targetClass); enhancer.setCallback(new 打架小帮手()); return enhancer.create(); } }
public class 威哥 {public static void main(String rags[]){ 打架 打架 = new 打架();打架小帮手 帮手 = new 打架小帮手();打架 打架代理 = (打架) 帮手.createProxy(打架.getClass());打架代理.开打();}}