cglib代理

需下载包:

cglib-nodep-2.2.jar
asm-all-4.0.jar

FlashDisk.java

package net.wchdai.spring.dao.impl;

import java.util.Date;

import net.wchdai.spring.dao.Disk;

public class FlashDisk{

    private String mDiskName;
    private Date mMadeDate;

    public FlashDisk() {
        System.out.println("FlashDisk constructor.");
    }

    public void init() {
        System.out.println("FlashDisk init.");
    }

    public void destroy() {
        System.out.println("FlashDisk destroy.");
    }

    public Date getmMadeDate() {
        return mMadeDate;
    }

    public void setmMadeDate(Date mMadeDate) {
        System.out.println("setMadeDate");
        this.mMadeDate = mMadeDate;
    }

    public String getmDiskName() {
        return mDiskName;
    }

    public void setmDiskName(String mDiskName) {
        this.mDiskName = mDiskName;
    }

    public void read() {
        System.out.println("flash disk read...");
    }

    public void write(String data) {
        System.out.println("flash disk write:" + data);
    }

    public String printInfo() {
        return "FlashDisk " + getmDiskName() + ", made date:"
                + mMadeDate.toString();
    }
}

CglibDiskProxy.java

package net.wchdai.spring.proxy;

import java.lang.reflect.Method;

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

public class CglibDiskProxy implements MethodInterceptor{

    public Object bind(Object obj){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("pre invoke.....");
        proxy.invokeSuper(obj,args);
        System.out.println("after invoke.....");
        return null;
    }

}

TestDisk.java

package net.wchdai.spring;

import junit.framework.TestCase;
import net.wchdai.spring.dao.Disk;
import net.wchdai.spring.dao.impl.FlashDisk;
import net.wchdai.spring.proxy.CglibDiskProxy;
import net.wchdai.spring.proxy.JDKDiskProxy;

public class TestDisk extends TestCase{
//  public void testDisk(){
//      ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
//      Disk disk1 = (Disk)ctx.getBean("flashdisk");
//      Disk disk2 = (Disk)ctx.getBean("flashdisk");
//      System.out.println(disk1.hashCode());
//      System.out.println(disk2.hashCode());
//  }

//  public void testDynamicProxy(){
//      Disk flashdisk = new FlashDisk();
//      JDKDiskProxy proxy = new JDKDiskProxy();
//      flashdisk = (Disk)proxy.bind(flashdisk);
//      flashdisk.write("XXXXX");
//  }

    public void testCglibProxy(){
        FlashDisk flashdisk = new FlashDisk();
        CglibDiskProxy cgproxy = new CglibDiskProxy();
        flashdisk = (FlashDisk)cgproxy.bind(flashdisk);
        flashdisk.write("cglibXXXX");
    }
}

输出

FlashDisk constructor.
FlashDisk constructor.
pre invoke.....
flash disk write:cglibXXXX
after invoke.....

输出中可以看出FlashDisk的构造函数被调用了两次
cglib是生成被代理对象的子类,所以会调用两次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值