动态代理的实现1-简单实现
2012-07-27 14:09
316 查看
![](http://my.csdn.net/uploads/201206/30/1341061511_1307.jpg)
![](http://my.csdn.net/uploads/201206/30/1341061775_5365.jpg)
![](http://my.csdn.net/uploads/201206/30/1341061844_7379.jpg)
![](http://my.csdn.net/uploads/201206/30/1341061882_4604.jpg)
![](http://my.csdn.net/uploads/201206/30/1341061932_8750.jpg)
public class Test { public static void main(String[] args) throws Exception{ //第一种实现方式:分步骤操作 Class clazzproxy=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class); Constructor consproxy=clazzproxy.getConstructor(InvocationHandler.class); Collection con1=(Collection) consproxy.newInstance(new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; } }); System.out.println(con1);//打印结果是"null" //不会报错,首先会先生成一个临时的代理类$Proxy0,然后这个代理类实现Collection //然后这个代理类的内部会调用InvocationHandler的invo方法 con1.clear(); //会报空指针错误,原因是在调用InvocationHandler的invo方法时会返回null //但是size()方法的返回值是int类型 // con1.size(); //第二种实现方式:整合在一个方法中进行操作,但是日志功能都是硬编码在代理中 Collection con = (Collection)Proxy.newProxyInstance( Collection.class.getClassLoader(), new Class[]{Collection.class}, new InvocationHandler() { List target=new ArrayList(); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始记录日志...."); System.out.println(proxy.getClass().getName()); System.out.println("运行方法名:"+method.getName()); System.out.println("运行方法参数值:"+Arrays.toString(args)); //在这里可以对参数args进行过滤,也可以对返回的结果进行修改 Object obj = method.invoke(target, args); System.out.println("记录日志结束...."); System.out.println(); return obj; } } ); con.add("aa"); con.add("bb"); con.add("cc"); System.out.println(con.size()); System.out.println(con.getClass().getName());//$Proxy0 //这里为什么返回的是$Proxy0 而不是ArrayList呢,那是因为在使用动态代理的过程中 //会生成一个临时的代理类$Proxy0,详细可看设计模式中的动态代理 /** 运行结果: 开始记录日志.... $Proxy0 运行方法名:add 运行方法参数值:[aa] 记录日志结束.... 开始记录日志.... $Proxy0 运行方法名:add 运行方法参数值:[bb] 记录日志结束.... 开始记录日志.... $Proxy0 运行方法名:add 运行方法参数值:[cc] 记录日志结束.... 开始记录日志.... $Proxy0 运行方法名:size 运行方法参数值:null 记录日志结束.... 3 $Proxy0 */ } }
相关文章推荐
- JDK中的Poxy类简单实现动态代理
- 静态代理和动态代理的简单实现
- 使用动态代理实现简单AOP
- 动态代理的简单实现
- 使用动态代理实现一个简单web客户端
- PHP实现依赖注入-使用反射机制和动态代理技术 - 简单思想(咋个办呢 zgbn)
- 动态代理--简单实现
- 动态代理的简单实现
- Jdk动态代理简单实现
- 动态代理简单实现
- Java动态代理实现(简单AOP实现)
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- 复习笔记:一个简单的动态代理实现
- JDK动态代理实现简单AOP--转
- Java动态代理简单实现
- aop学习总结一------使用jdk动态代理简单实现aop功能
- Java反射之JDK动态代理实现简单AOP
- 动态代理简单实现-1
- ava中代理,静态代理,动态代理实现原理简单易懂
- JAVA动态代理 和 Spring AOP 4种通知的简单实现