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