Java 动态代理

 

一:Proxy动态代理

JDK生成最终真正的代理类,它继承自Proxy并实现了我们定义的IText接口,在实现IText接口方法的内部,通过反射调用了TestInvocationHandler的invoke方法。

需要元素,
1、InvocationHandler实现类,只能对接口进行代理;
2、被代理接口即interface
3、被代理接口的实现类

第1步:定义interface
    public interface IText{
        public String test(String arg);
    }
第2步:实现接口
    public class ImplText implements IText{
        public String test(String arg){
        return "";
        }
    }


 第3步:实现InvocationHandler类

    public class TestInvocationHandler implements InvocationHandler{
        /***
        *Object proxy代理对象
        *Method method,被代理方法
        *Object[] objs 执行方法所需要的参数列表
        *
        *
        */
        Object target;//实际被代理对象
        public TestInvocationHandler(Object target){'
            this.target=target;
        }
        /
        public Object invoke(Object proxy,Method method,Object[] objs){
            return method.invoke(target,objs);
        }


    }

第4步:
    ImplText impl=new ImplText();
    TestInvocationHandler in=new TestInvocationHandler(impl);
    IText ite=Proxy.newProxyInstance(ImplText.class.getClassLoader(),new Class[]{IText.class},in)
    ite.test("==");




二:CGLib  第三方框架,主要是利用字节码生成被代理类的的子类,然后在子类中对 被代理方法前后后方插入逻辑代码。

1、
public class UserManager {  
         
    public void function(){    

    }}

2、public class CglibProxy implements MethodInterceptor {  
 
    private Enhancer enhancer = new Enhancer();    
    public Object getProxy(Class clazz){    
       
        enhancer.setSuperclass(clazz);    
 
        enhancer.setCallback(this);    
  
        return enhancer.create();    
    }    
      
    public Object intercept(Object obj, Method method, Object[] args,  
            MethodProxy proxy) throws Throwable {  
        System.out.println(“method before”);    
    
        Object result = proxy.invokeSuper(obj,args);    
     System.out.println(“method affter”);   

        return result;    
    }  
}

3、

        CglibProxy proxy = new CglibProxy();   
        UserManager um = (UserManager)proxy.getProxy(UserManager.class);  
        um.function(); 



posted @ 2017-06-23 13:37  清澈见底  阅读(106)  评论(0编辑  收藏  举报