需下载包:
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是生成被代理对象的子类,所以会调用两次