一. 使用 jdk 动态代理是需要建立在接口的实现类上面(就是说需要提供接口和实现类)
如下定义一个接口 jdkDynamic
在定义一个实现类来实现它
jdk 动态代理是 java jdk 自带的一个 api 类想要使用它也是很简单,新建一个代理类实现接口 InvocationHandler
实现他的方法 invoke
/** * <pre> * @Auther: ousakai * @Date: 2019-10-15 15:27 * @Description: * 修改版本: 1.0 * 修改日期: * 修改人 : * 修改说明: 初步完成 * 复审人 : * </pre> */ public class JdkDynamicInvok<T> implements InvocationHandler { private T object; public JdkDynamicInvok(T object){ this.object=object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("你想看什么鬼"); Object objects=method.invoke(object,args); System.out.println("看完后你觉得怎么杨"); return objects; } public T getInstance(){ T proxy = (T)Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this); return proxy; } }
proxy 代理对象要求传入三个参数第一个是目标类的加载类,第二个是目标类实现的接口类,第三个是回调的类也就是代理类会执行 invoke 方法:下面我们来写写测试用例:
public class JdkDynamicTestDriver { public static void main(String[] args) { //jdk动态代理 JdkDynamic object = new JdkDynamicInvok<JdkDynamic>(new JdkDynamicImpl()).getInstance(); object.lookUp(); } }
执行结果如下:
是吧是很简单就实现了代理
二.cglib 代理就不需要有接口类只有是个类就可以使用代理
我们还是使用 jdkDynamic 的实现类来做测试
这其实是可以不用实现 jdkDynamic 的我这里为了方便就没有删除
小伙伴们可以只使用类来做目标类
开始我们的表演 新建一个 Cglib 的类实现 MethodInterceptor
的 interceptor
对了 methodInterceptor 类是需要 cglib-nodep-2.2.jar
/** * <pre> * @Auther: ousakai * @Date: 2019-10-15 15:45 * @Description: * 修改版本: 1.0 * 修改日期: * 修改人 : * 修改说明: 初步完成 * 复审人 : * </pre> */ public class Cglib implements MethodInterceptor { public <T>T proxy(T target) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return (T) enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("看什么看米色吗好看的"); Object t= methodProxy.invokeSuper(o,objects); System.out.println("看来你还是看了"); return t; } }
测试使用
public static void main(String[] args) { //jdk动态代理 JdkDynamic object = new JdkDynamicInvok<JdkDynamic>(new JdkDynamicImpl()).getInstance(); object.lookUp(); //cglib代理 JdkDynamicImpl jdkDynamic=new Cglib().proxy(new JdkDynamicImpl()); jdkDynamic.seeYou(); } }
最后输出结果为:
很简单吧! 这里面有个重点就是 Enhancer(增强) 它的方法 setSuperclass 接收目标类作为夫类,setCallback 接受一个回调类用于执行 intercept
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于