动态代理小笔记
代理的好处:代理去代替本体去执行相同的功能,且根据有丰富的灵活性和拓展性
其核心思想:在运行时动态地根据不同的本体生成相应的代理类!
JDK动态代理(本体必须实现接口)
代理必须实现此接口 (InvocationHandler)
class LawyerProxy implements InvocationHandler {
private Object object;
public LawyerProxy(Object object) {
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("speak")){
System.out.println("引用法律条文!");
method.invoke(object, args);//反射
System.out.println("打人是不对的!");
}
return null;
}
}
实现:
@Test
public void test() {
//静态代理
Speaker speaker = new Lawyer();
speaker.speak();
//动态代理
LawyerProxy lawyerProxy = new LawyerProxy(new ZhangSsan());
Speaker speaker1 = (Speaker) Proxy.newProxyInstance(Demo.class.getClassLoader(),new Class[]{Speaker.class},lawyerProxy);
speaker1.speak();
}
CGLib动态代理(JDK代理的补充,不需要去实现接口)
首先导入cglib的依赖
代理必须实现此接口 (MethodInterceptor)
class LawyerInteceptor implements MethodInterceptor {
private Object object;
public LawyerInteceptor(Object object) {
this.object = object;
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
if (method.getName().equals("speak")) {
System.out.println("引用法律条文!");
method.invoke(object, objects);
System.out.println("打人是不对的!");
}
return null;
}
}
实现:
@Test
public void test() {
//CGLib代理
LawyerInteceptor lawyerInteceptor = new LawyerInteceptor(new Lisi());
Lisi lisi = (Lisi) Enhancer.create(Lisi.class,lawyerInteceptor);
lisi.speak();
}