Proxy动态代理

来源:互联网 发布:centos kde gnome共存 编辑:程序博客网 时间:2024/05/18 23:12

Proxy动态代理

什么是动态代理

说起动态,其实不如先说什么是静态。所谓静态代理,个人理解为自己手写的代理类,或者用工具生成的代理类,或者别人帮你写的代理类。总之,就是程序运行前就已经存在的编译好的代理类。 相反,如果代理类程序运行前并不存在,需要在程序运行时动态生成(无需手工编写代理类源码),那就是今天要说的动态代理了

  • 注意:动态代理的类必须要有接口

  • 动态代理的内部原理是:Java的反射机制

  • 请看下面的代码示例

Person接口

package cn.csx.proxy;public interface Person {String sing(String name);String dance(String name);}

具体类:Liyuechun

package cn.csx.proxy;public class Liyuechun implements Person {public String sing(String name){System.out.println("春哥唱"+name+"歌!!");return "飞吻!!";}public String dance(String name){System.out.println("春哥跳"+name+"舞!!");return "多谢多谢老板!!";}}

代理

public static Object newProxyInstance(ClassLoaderloader,Class<?>[]interfaces, InvocationHandler h)

ClassLoaderloader:代理类的类加载器

Class<?>[]interfaces:代理类所实现的接口列表(与真实主题类的接口列表一致)

InvocationHandler h:所指派的调用处理程序类

public class LiyuechunProxy {private Person chunchun = new Liyuechun();//  Person person =   LiyuechunProxy.getProxy();//  person.sing("山歌")  person.dance();public Person getProxy(){return (Person) Proxy.newProxyInstance(LiyuechunProxy.class.getClassLoader(), chunchun.getClass().getInterfaces(), new InvocationHandler(){/** * proxy : 把代理对象自己传递进来 * method:把代理对象当前调用的方法传递进来 * args:把方法参数传递进来 */public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {//编码指定返回的代理对象干的工作if(method.getName().equals("sing")){System.out.println("搞一万块钱来!!");return method.invoke(chunchun, args);  //找春哥唱歌}if(method.getName().equals("dance")){System.out.println("搞2万块钱来!!");return method.invoke(chunchun, args);  //找春哥跳舞}return null;}});}}

0 0
原创粉丝点击