静态代理与动态代理JDK/CGLIB
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
//静态代理
Speaker speakerStaic = new Lawyer(new ZhangSan());
speakerStaic.speak();
//JDK动态代理 解决每个类都必须有代理类的问题,依旧需要实现统一的接口 通过反射
LaywerProxy laywerProxy = new LaywerProxy(new Lisi());
Speaker speakerJDK = (Speaker) Proxy.newProxyInstance(ProxyTest.class.getClassLoader(), new Class[]{Speaker.class},laywerProxy);
speakerJDK.speak();
//cglib 动态代理 第三方类生成器,不用再实现统一的接口,作为JDK动态代理的补充
LawyerInteceptor lawyerInteceptor = new LawyerInteceptor(new WangWu());
WangWu wangWu = (WangWu) Enhancer.create(WangWu.class,lawyerInteceptor);
wangWu.speak();
//JDK动态代理和CGLIB字节码生成的区别?
//(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
//(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
//因为是继承,所以该类或方法最好不要声明成final
}
}
interface Speaker{
void speak();
}
class Lawyer implements Speaker{
ZhangSan zhangSan ;
Lawyer(ZhangSan zhangSan){
this.zhangSan = zhangSan;
}
@Override
public void speak() {
System.out.println("引用法律条文");
zhangSan.speak();
System.out.println("总结陈述");
}
}
class ZhangSan implements Speaker{
@Override
public void speak(){
System.out.println("我是张三,我老婆打我");
}
}
class LaywerProxy implements InvocationHandler{
Object obj;
LaywerProxy(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("speak")){
System.out.println("引用法律条文");
method.invoke(obj,args);
System.out.println("总结陈述");
}
return null;
}
}
class Lisi implements Speaker{
@Override
public void speak(){
System.out.println("我是李四,我老婆打我");
}
}
class LawyerInteceptor implements MethodInterceptor{
private Object obj;
LawyerInteceptor(Object obj){
this.obj = obj;
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if(method.getName().equals("speak")){
System.out.println("引用法律条文");
method.invoke(obj,args);
System.out.println("总结陈述");
}
return null;
}
}
class WangWu implements Speaker{
@Override
public void speak(){
System.out.println("我是王五,我老婆打我");
}
}