java 动态代理

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...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值