添加签名相同但返回值不同的方法

添加签名相同但返回值不同的方法

在面试时,被问到,为什么重载是参数不相同,而不是返回值不相同或者同时不相同?仔细一想,这个问题。。。,我们来做一个实验。

package com.lux.study.assist;

/**
 * @author: lux
 * @date: 2017/10/24 13:51
 */
public class UserInfo {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

这是上次的主角UserInfo类,如果我们尝试添加一个返回值为Integer的getName方法,将无法通过编译。

Error:(22, 20) java: 已在类 com.lux.study.assist.UserInfo中定义了方法 getName()

下面我们通过javassist来生成这样一个签名相同返回值不同的函数,并反射调用。

package com.lux.study.assist;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;

import java.lang.reflect.Method;

/**
 * @author: lux
 * @date: 2017/11/1 23:25
 */
public class MethodTest {
    public static void main(String[] args) {
        String className = "com.lux.study.assist.UserInfo";
        UserInfo userInfo = new UserInfo();
        userInfo.setName("test");
        userInfo.setId(1);
        try {
            ClassPool pool = ClassPool.getDefault();
            CtClass cc = pool.get(className);
            CtMethod mthd = CtNewMethod.make("public Integer getName() { return  Integer.valueOf(2); }", cc);
            cc.addMethod(mthd);
            AppClassLoader appClassLoader = AppClassLoader.getInstance();
            Class<?> clazz = appClassLoader.findClassByBytes(className, cc.toBytecode());
            Object obj = appClassLoader.getObj(clazz, userInfo);
            Method[] methods = obj.getClass().getDeclaredMethods();
            for (Method method : methods) {
                if (method.getName().contains("getName")) {
                    System.out.println(method.toString() + " -> " + method.invoke(obj));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是最后的结果,证明方法返回值还是有用的,至于为什么重载的时候,必须是参数不相同,而不是返回值不相同,可能就是别人说的,大多时候,我们可能并不关心返回结果。

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • 本文翻译自 Javassist Tutorial-2 4. 自省和自定制 (Introspection and c...
    二胡阅读 32,711评论 4 33
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,112评论 0 4
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,850评论 6 13
  • 0727(D12)亲爱的师师,我知道你身上有许多美好的特质,今天我欣赏并标明你以下特质 1.认真学习,今天早晨看了...
    师师成长记阅读 921评论 0 0