动态代理模式的相关细节描述
2014-04-23 10:15
253 查看
public interface House//动态代理模式必须使用接口,需要注意 { public void findHouse(); } public class EmployeeWish implements House { public void findHouse()//真实对象实现接口中方法 { System.out.println("Where to find the house?"); } } import java.lang.reflect.*; public class Helper implements InvocationHandler//代理角色必须实现InvocationHandler接口中的invoke方法 { private Object obj;//接收类型为object类型,多态的使用,使得动态代理模式可以进行多种类型的代理,没有局限性 public Helper(Object obj) { this.obj=obj; } @Override public Object invoke(Object proxy, Method method, Object[] args)//接收参数自动从代理实例所调用的方法中加载,有底层去实现,无需过分操心! throws Throwable { Object object=method.invoke(obj, args);//通过接收的方法,使用反射调用真实对象中的方法 return obj; } } import java.lang.reflect.*; public class Test { public static void main(String args[]) { EmployeeWish employee=new EmployeeWish(); Class<?> classType=employee.getClass(); Helper help=new Helper(employee);//注意使用Proxy的静态方法生成代理实例时的接收参数 House house=(House)Proxy.newProxyInstance(classType.getClassLoader(),classType.getInterfaces(), help); //由于静态方法接收参数种知道了对象所实现的接口,因而该代理实例也实现了这些接口,使用多态可将其类型转换为接口类型! house.findHouse();//通过代理实例调用方法时,会自动转移到代理对象中的invoke方法 } }
相关文章推荐
- ThinkPHP函数详解:C方法
- 手动模拟输出json
- DataReader也玩超酷数据显示分页
- 查看软件使用的端口
- 搜寻最长回文子串的解法之比较
- java设计模式---策略
- 为DataGrid 写一个 DropDownListColumn
- 在asp.net中使用excel模板
- JS创建对象
- 不能正常使用网银Win8.1怎么启用或禁用IE11保护模式
- ARM® NEON™
- 我希望我知道的七个JavaScript技巧
- 《Java解惑》系列——Java中的转义字符(为谜题14至17提供基础知识)
- 防止应用程序被反编译的译源码混淆控件Dotfuscator
- 今天的收获
- 把HTML表单提交的数据转化成XML文件
- [Android学习系列9]关于Fragment的一些事
- 解决Access文件越来越大的问题
- ASP中SQL语句导致的性能问题
- MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别