java反射机制实现动态代理只能应用于实现接口的类(例子中的FlashDisk)。
如果想不实现接口,直接使用动态代理,可以使用cglib。
Disk接口
package net.wchdai.spring.dao;
public interface Disk {
public void read();
public void write(String data);
public String printInfo();
}
Disk实现类
package net.wchdai.spring.dao.impl;
import java.util.Date;
import net.wchdai.spring.dao.Disk;
public class FlashDisk implements Disk {
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;
}
@Override
public void read() {
System.out.println("flash disk read...");
}
@Override
public void write(String data) {
System.out.println("flash disk write:" + data);
}
@Override
public String printInfo() {
return "FlashDisk " + getmDiskName() + ", made date:"
+ mMadeDate.toString();
}
}
代理类
package net.wchdai.spring.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DiskProxy implements InvocationHandler{
private Object objBind = null;
public Object bind(Object obj){
objBind = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("preinvoke method...");
Object ret = method.invoke(objBind, args);
System.out.println("after invoke method...");
return ret;
}
}
测试类
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.DiskProxy;
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();
DiskProxy proxy = new DiskProxy();
flashdisk = (Disk)proxy.bind(flashdisk);
flashdisk.write("XXXXX");
}
}
输出
FlashDisk constructor.
preinvoke method...
flash disk write:XXXXX
after invoke method...