【问题标题】:duplicate method in javap resultjavap结果中的重复方法
【发布时间】:2020-11-13 01:50:45
【问题描述】:

BaseController中有一个方法,例如

public abstract class BaseManagementController<V, F extends BaseForm> {

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    protected void add(@Valid @RequestBody F form, HttpServletRequest request) {
        // ...
    }
}

一个具体的控制器扩展它并覆盖添加方法

public class BannerController extends BaseManagementController<BannerVO, BannerForm> {
    @Override
    public void add(@Valid @RequestBody BannerForm form, HttpServletRequest request) {
        super.add(form, request);
    }
}

当我javap BannerController 我看到两个添加方法

 public void add(com.foo.admin.web.vo.BannerForm, javax.servlet.http.HttpServletRequest);
    descriptor: (Lcom/foo/admin/web/vo/BannerForm;Ljavax/servlet/http/HttpServletRequest;)V
    flags: ACC_PUBLIC


  public void add(com.foo.admin.web.vo.BaseForm, javax.servlet.http.HttpServletRequest);
    descriptor: (Lcom/foo/admin/web/vo/BaseForm;Ljavax/servlet/http/HttpServletRequest;)V
    flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC

为什么有两个 add 方法?是不是超载了?

【问题讨论】:

    标签: java generics javap


    【解决方案1】:

    为什么有两个 add 方法?

    因为可能有一些功能可能更普遍适用所有Controllers。并且该通用功能可以在 BaseManagementController.add()...

    中实现
    public abstract class BaseManagementController<V, F extends BaseForm> {
    
        @PostMapping
        @ResponseStatus(HttpStatus.CREATED)
        protected void add(@Valid @RequestBody F form, HttpServletRequest request) {
            /* ...All Controllers need to do this... */
            controlStuff(form, request);
        }
    
        private void controlStuff(F form, HttpServletRequest request) {
            /* ...do whatever Controllers do...*/
        }
    }
    

    然后您的更专业 实现,如 BannerController.add() 只能做一些与横幅相关的事情......

    public class BannerController extends BaseManagementController<BannerVO, BannerForm> {
    
        @Override
        public void add(@Valid @RequestBody BannerForm form, HttpServletRequest request) {
            super.add(form, request);
            processBanner(form, request);
        }
    
        private void processBanner(BannerForm form, HttpServletRequest request) {
            /*...do something special for banners...*/
        }
    }
    

    子类的 add() 可以简单地调用 super.add() 并在其父类的实现中捎带现有功能。

    是不是超载了?

    没有。但它是overridden

    在类 C 中声明或继承的实例方法 m<sub>C</sub>从 C 中覆盖在类 A 中声明的另一个方法 m<sub>A</sub>,如果满足以下所有条件:

    • C 是 A 的子类
    • C 不继承 m<sub>A</sub>
    • mC 的签名是 m<sub>A</sub>签名的子签名(§8.4.2
    • 以下之一是 真的
      • m<sub>A</sub> 是公开的
      • ...

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 2012-02-14
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2010-11-02
      相关资源
      最近更新 更多