美文网首页
添加签名相同但返回值不同的方法

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

作者: 繁星若尘啊 | 来源:发表于2017-11-01 23:47 被阅读115次

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

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

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

相关文章

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

    添加签名相同但返回值不同的方法 在面试时,被问到,为什么重载是参数不相同,而不是返回值不相同或者同时不相同?仔细一...

  • 17. 方法重载和默认参数

    方法的重载 Overloads 名称相同、参数不同的方法 Jvm函数签名的概念:函数名、参数列表 跟返回值没有关系...

  • 继承关系中的方法覆写

    方法覆写的原则(一同两小一大) 一同:方法签名必须相同 两小:子类方法声明的返回值类型是和父类方法的返回值相同或者...

  • Java方法签名与方法块

    Java方法签名 Java的方法签名不包括返回值。 Java的方法签名包括:方法名和参数。不包括方法返回值。所以由...

  • Java重载(Overload)时的参数匹配原则

    重载的定义 类中的方法如果有相同的方法名、不同的方法签名,那么这几个方法是可以重载的。 什么是方法签名? 方法签名...

  • java协变函数

    java 方法名相同,参数列表相同,返回值不同一般会报错,但有一种特殊情况 :java 5.0添加了对协变返回类型...

  • android面试题

    答: 方法的重载属于编译时多态,方法名相同参数列表不同,返回值必须相同或都没有返回值类型。方法的重写属于运行时多态...

  • 对象构造

    重载 如果多个方法或构造器有相同的方法名称、不同的参数,便使用了重载。 方法签名 方法签名:方法名+参数类型 默认...

  • 2017.10.18

    今天上课老师主要讲了逻辑运算符、方法重载等。而方法重载依赖于方法签名。方法的重载就是同一个类中添加几个名字相同,但...

  • oc方法签名(Method Signature)机制

    方法签名 oc对方法的参数个数、参数类型以及返回值类型的描述,每个方法都有一个方法签名 假设有方法签名为"@@:@...

网友评论

      本文标题:添加签名相同但返回值不同的方法

      本文链接:https://www.haomeiwen.com/subject/hcpnpxtx.html