java的动态代理

     java的动态代理如果利用好了,可以拓展一个类的功能。举个例子,mybatis是怎么把interface的方法和mapper文件里的sql语句关联?mybatis的getMapper(),就是通过动态代理,从map中根据该方法名称,得到要执行的sql,最后交给executor执行。

动态代理实现:继承InvocationHandler类,然后重写invoke()方法

正常实现:

public class proxyTest implements InvocationHandler{

           public Object invoke(Object proxy, Method method ,Object[] args){

                                //method :被代理对象执行的方法

                                //args:被代理对象执行的方法传入的参数

              }

}

public static void main(String[] args){

           ProxyTest proxy = new ProxyTest();

           User u = (User)Proxy.newProxyInstance(p.getClass().getClassLoader(),new Class[]{User.Class},proxy);

            u.do();

}

这是最简便的写法

封装一下:

public class  ProxyTest implements InvocationHandler{

         public <T>  T newInstance(Class<T> cls){

                   return  (T)  Proxy.newProxyInstance(T.getClassLoader(),new Class[]{T},this)

          }

           public Object invoke(Object proxy, Method method ,Object[] args){

                                //method :被代理对象执行的方法

                                //args:被代理对象执行的方法传入的参数

              }

}

所有的类都有父类Object,Object有9个方法toString,equals,wait,notify,notifyAll,,hashcode,finalize,clone,getClass,如果是这些方法要把它们过滤,

java.lang.reflect.Method.getDeclaringClass()方法返回表示声明由此Method对象表示的方法的类的Class对象。

if(Object.class.equals(method.getDeclaringClass())){

          return method.invoke(this,args);//this这个对象调用method这个方法,参数是args

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 994评论 0 1
  • 在java 的动态代理机制中,有两个重要的类或者接口,一个是InvocationHandler(interface...
    Ace_Chen阅读 244评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,009评论 19 139
  • 我的婆婆。一个皮肤白皙,保养还可以,吃的苦没享的福多,为人还算比较和善,没有主见,比较爱哭,三个孩子的妈。 ...
    牛苜苜阅读 329评论 0 0
  • 1.对比原理:它会影响我们对前后两件事物之间差异的判断。如果两件东西很不一样,我们往往会认为它们自己的差别比实际更...
    正版书呆子阅读 439评论 0 1