java 动态代理
2015-06-25 10:38
274 查看
java反射机制实现动态代理只能应用于实现接口的类(例子中的FlashDisk)。
如果想不实现接口,直接使用动态代理,可以使用cglib。
Disk接口
Disk实现类
代理类
测试类
输出
如果想不实现接口,直接使用动态代理,可以使用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...
相关文章推荐
- 使用Java VisualVM监控远程JVM
- java中File目录管理(四)目录管理小工具的设计
- 《Java并发编程实践》笔记3——线程池基础
- 转载:Java中普通代码块,构造代码块,静态代码块区别及代码示例
- JAVA设计模式(22):行为型-解释器模式(Interpreter)
- java swing
- Java继承的基本概念及其限制 总结
- 使用Spring的NamedParameterJdbcTemplate完成DAO操作
- Struts2 Web资源获取
- java之yield(),sleep(),wait()区别详解
- Javassist详解
- 在eclipse中切换不同workspace的方法和打开已经存在的工程的方法
- JAVA设计模式(21):行为型-迭代器模式(Iterator)
- Myeclipse将控制台日志输出到文件中和显示更多的日志信息
- html抽取文本信息-java版(适合lucene建立索引)
- 用Java实现FTP批量大文件上传下载
- Struts2 的工作原理
- 各种排序算法的分析及java实现
- Java的内存机制
- Hibernate懒加载异常解决