静态代理与动态代理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();
LaywerProxy laywerProxy = new LaywerProxy(new Lisi());
Speaker speakerJDK = (Speaker) Proxy.newProxyInstance(ProxyTest.class.getClassLoader(), new Class[]{Speaker.class},laywerProxy);
speakerJDK.speak();
LawyerInteceptor lawyerInteceptor = new LawyerInteceptor(new WangWu());
WangWu wangWu = (WangWu) Enhancer.create(WangWu.class,lawyerInteceptor);
wangWu.speak();
}
}
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("我是王五,我老婆打我");
}
}