java代理笔记:静态代理、JDK动态代理、CGlib动态代理

1.静态代理

//接口类
public interface Hello{
     void say(String name);   
 }    
//实现类
 public class HelloImpl implements Hello{
        @Override
        public void say(String name){
            System.out.println(name);
        }
  }
//代理类
 public class HelloProxy implements Hello{
    private Hello hello;
    
    public HelloProxy(){
        hello=new HelloImpl();
    }
    
    @Override
    public void say(String name){
            before();
            hello.say(name);
            after();
    }
    
    private void before(){
        
    }
    
    private void after(){
        
    }
}
  public static void main(String[] args){
            Hello helloProxy=new HelloProsy()
            helloProxy.say("Hi");
   } 

JDK动态代理

  //动态代理类
  /* param1: ClassLoader
   * param2: 该实现类的所有接口
   * param3: 动态代理类对象
   */
public class DynamicProxy implements InvocationHandler{
    private Object target;
    public DynamicProxy(Object target){
        this.target=target
    }
    
    @Override
    public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{    
        before();
        Object result=method.invoke(target,args);
        after();
        return result
    }
    ...
}
   
public static void main(String[] args){
    Hello hello =new HelloImpl();
    DynamicProxy dynamicProxy=new DynamicProxy(hello);
    Hello helloProxy=(DynamicProxy)Proxy.newProxyInstance(
    hello.getClass().getClassLoader(),hello.getClass().getInterfaces(),dynamicProxy
    );
    helloProxy.say("Hi");
}

CGlib动态代理

  public class CGLibProxy implements MethodInterceptor{
    public <T> T getProxy(Class<T> cls){
        return (T) Enhancer.create(cls,this);
    }
    
    public Object intercept(Object obj,Method method,Object[] args,MethodProxy proxy) throws Throwable{
        before();
        Object result=proxy.invokeSuper(obj,args);
        after();
        return result;
    }
    ...
}

public static void main(String[] args){
    CGLibProxy cGLibProxy =new CGLibProxy();
    Hello helloProxy=cGLibProxy.getProxy(HelloImpl.class);
    helloProxy.say("Hi");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容