理解Java方法增强
- 2020 年 1 月 19 日
- 筆記
在实际开发中,我们往往需要对某些方法进行增强,常用的方法增强的方式有三种。
- 类继承 、方法覆盖 必须控制对象创建,才能使用该方式
- 装饰者模式方法加强 必须和目标对象实现相同接口或继续相同父类,特殊构造器(传入被包装对象)
- 动态代理
我们来编写一个案例感受一下,新建一个Java项目。 新建类Cat
public class Cat{ public void run(){ System.out.println("喵喵~一只猫在奔跑"); } }
现在若想对该类的run()方法进行增强,第一种方法,利用类继承,方法覆盖。 编写测试代码
@Test public void demo1(){ //方法增强的第一种途径,利用类的继承以及方法覆盖 Cat cat = new Cat(){//匿名内部类 @Override public void run() { //保持方法原有的功能 super.run(); //新增该方法功能 System.out.println("抓到一只老鼠"); } }; cat.run(); }
运行测试代码

方法成功被增强了。 该种增强方法的方式必须控制对象的创建。
那么第二种增强方式就是装饰者模式,但是请注意,使用该方式增强方法是有前提的,就是必须与原对象去实现相同的接口或者继承相同的类。 演示一下。 新建一个接口ICat
interface ICat{ public void run(); }
然后新建一个装饰者CatFilter
//装饰者 class CatFilter implements ICat{ private ICat cat;//cat就是被包装的对象 //实现目标对象相同的接口 //特殊的构造方法 public CatFilter(ICat cat){ this.cat = cat; } public void run() { //原有方法功能 cat.run(); //新增方法功能 System.out.println("又抓住一只老鼠"); } }
编写测试代码
@Test public void demo2(){ //第二种 装饰者模式 前提:必须与原对象去实现相同的接口或者继承相同的类 ICat cat = new CatFilter(new Cat()); cat.run(); }

方法被成功增强。
第三种增强方式就是动态代理,也是Java中进行方法增强最常用的方式。 原理:根据原对象在内存中构造一个代理对象,而原对象的所有方法都将去执行代理对象的invoke方法。 演示一下。 编写测试代码
@Test public void demo3(){ final ICat cat = new Cat();//原对象 ICat catProxy = (ICat) Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] objs) throws Throwable { //增强run方法 if(method.getName().equals("run")){ method.invoke(cat,objs);//调用原对象的方法,保留原方法的功能 //新增功能 System.out.println("抓住第三只老鼠"); } return null; } }); catProxy.run(); }
运行测试代码

方法被成功增强。 以上便是Java方法增强的三种方式。