前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java增强原有方法的三种方式

Java增强原有方法的三种方式

作者头像
ZackSock
发布2020-01-19 19:47:21
1.5K0
发布2020-01-19 19:47:21
举报
文章被收录于专栏:ZackSockZackSock

1、第一种,也是最简单的一种,继承类,覆盖原有方法

代码语言:javascript
复制
Cat cat = new Cat(){    @Override	public void run(){        //调用父类的run方法		super.run();		System.out.println("我是方法增强部分");	}	}

这个比较容易理解,而且我们也用的挺多的。但是用这个方法有一个前提,就是我们能控制类的创建。这种时候,才能这么做。比如工场模式就不能这样。

2、装饰者模式

这个比第一个复杂很多,这里我慢慢解释。

首先,假如我们还是要增强Cat的run方法。假设Cat实现一个ICat接口。这个时候我们需要一个装饰者来帮我们扩展方法。而且这个装饰者必须实现ICat接口。(实际运用中,装饰者必须与源对象实现相同接口或者继承相同父类)下面就是装饰者类的写法

代码语言:javascript
复制
class CatFilter implements ICat{    //声明cat对象    private ICat cat;    public CatFilter(ICat cat){    this.cat = cat;  }
  public void run(){      cat.run();      System.out.println("这是方法增强部分");  }  }

在我们扩展方法时,就应该调用装饰者的run方法

代码语言:javascript
复制
ICat cat = new Cat();CatFilter catFilter = new CatFilter(cat);catFilter.run();

3、动态代理

这里就不细纠动态代理是啥了,一般写法都不会变

代码语言:javascript
复制
//创建Cat对象ICat cat = new Cat();ICat catProxy = Proxy.newProxyInstance(cat.getClass().getClassLoader,                              cat.getClass().getInterfaces(),       new InvocationHandler(){        public Object invoke(Object proxy, Method method,          Object[] args) throws Throwable{          if(method.getName().eques("run")){            method.invoke(cat, args);            System.out.println("这是方法增强部分");          }          return null;          }      });catProxy.run();

这里就是调用Proxy.newProxyInstance()方法,传入三个参数。

第一个就是ClassLorder,第二个是对象的所有接口,第三个就是InvocationHandler。重写InvocationHandler中的invoke方法,并在方法里面通过方法名判断,需要增强的方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 新建文件夹X 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档