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

  • 2020 年 1 月 19 日
  • 筆記

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

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

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

2、装饰者模式

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

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

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

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

ICat cat = new Cat();CatFilter catFilter = new CatFilter(cat);catFilter.run();

3、动态代理

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

//创建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方法,并在方法里面通过方法名判断,需要增强的方法。