动态代理之jdk/cglib

jdk动态代理

1.先要有一个接口:Seller卖房的,有一个方法sell()卖房

2.实现上边的接口:知春路有一个卖房的房东,实现seller:ZclSeller

3.代理类:链家地产LjdcProxy

  1.实现接口:InvocationHandler

  2.重写方法:invoke

4.交易Buyer买房

  就是这样调用生成相应的类,也不用解释:

  Seller seller2 = (Seller) Proxy.newProxyInstance(seller1.getClass().getClassLoader(), seller1.getClass().getInterfaces(), proxy);

package dp.dynamicProxy.jdk;

public interface Seller {
    
    public void sell(String name);

}
Seller
package dp.dynamicProxy.jdk;

public class ZclSeller implements Seller {

    @Override
    public void sell(String name) {
        System.out.println(name+"知春路卖房。。");

    }

}
ZclSeller
package dp.dynamicProxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class LjdcProxy implements InvocationHandler{

    Seller seller;
    
    public void beforeSell(){
        System.out.println("把相关证明准备齐全,才可以买房");
    }
    
    public LjdcProxy(Seller seller) {
        this.seller = seller;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        
        this.beforeSell();
        Object o = method.invoke(seller, args);
        return o;
    }

}
LjdcProxy
package dp.dynamicProxy.jdk;

import java.lang.reflect.Proxy;

/**
 * 代理模式
 * 
 * @author liuzunli
 *
 */
public class Buyer {
    
    public static void main(String[] args) {
        
        Seller seller1 = new ZclSeller();
        LjdcProxy proxy = new LjdcProxy(seller1);
        Seller seller2 = (Seller) Proxy.newProxyInstance(seller1.getClass().getClassLoader(), seller1.getClass().getInterfaces(), proxy);
        seller2.sell("john");
    }

}
Buyer

cglib动态代理

maven

  <dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib-nodep</artifactId>
    <version>3.2.1</version>
  </dependency>

1.先要有一个类,不用是接口:知春路卖房的ZclSeller

2.代理类:链家地产LjdcProxy

  1.实现接口:MethodInterceptor

  2.重写方法:intercept

3.交易Buyer买房    

  Enhancer enhancer = new Enhancer();
  enhancer.setSuperclass(ZclSeller.class);//需要代理的类
  enhancer.setCallback(new LjdcProxy());//代理
  ZclSeller seller1 = (ZclSeller) enhancer.create();//生成需要代理的类实例

package dp.dynamicProxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;


public class LjdcProxy implements MethodInterceptor{

    public void beforeSell(){
        System.out.println("把相关证明准备齐全,才可以买房");
    }

    @Override
    public Object intercept(Object arg0, Method method, Object[] arg2,
            MethodProxy proxy) throws Throwable {
        this.beforeSell();
        return proxy.invokeSuper(arg0, arg2);
    }

}
LjdcProxy
package dp.dynamicProxy.cglib;


import net.sf.cglib.proxy.Enhancer;

/**
 * 代理模式
 * 
 * @author liuzunli
 *
 */
public class Buyer {
    
    public static void main(String[] args) {
        
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(ZclSeller.class);
        enhancer.setCallback(new LjdcProxy());
        ZclSeller seller1 = (ZclSeller) enhancer.create();
        seller1.sell("john");
    }

}
Buyer

这两者的区别:

jdk动态代理必须是接口

 

posted @ 2016-03-16 18:31  刘尊礼  阅读(109)  评论(0)    收藏  举报