您的位置:首页 > 编程语言 > Java开发

java 动态代理

2015-06-25 10:38 274 查看
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...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: