【问题标题】:reflection api give overloading on function's return type反射 api 对函数的返回类型进行重载
【发布时间】:2015-03-17 13:32:56
【问题描述】:

我正在使用反射 API 对 Java 方法进行一些查询。下面是代码 sn-p 找出调用的返回类型,比如new java.lang.StringBuilder().append('a')

Class<?> c = Class.forName("java.lang.StringBuilder");
Method[] mList = c.getMethods();

for (int i = 0; i < mList.length; i++) {
    if (mList[i].getName() == "append" 
          && mList[i].getParameterTypes().length == 1 
          && mList[i].getParameterTypes()[0].getCanonicalName() == "char") {
        System.out.println(mList[i]);
    }
}

奇怪的是,输出给出了

公共 java.lang.AbstractStringBuilder java.lang.StringBuilder.append(char)

public java.lang.Appendable java.lang.StringBuilder.append(char) 抛出 java.io.IOException

公共 java.lang.StringBuilder java.lang.StringBuilder.append(char)

而 Java API 规范仅将 StringBuilder 作为返回类型。这是否意味着 append 方法实际上在返回类型上重载了?

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    来自javadocs 我们有:

    返回一个包含反映所有公共的 Method 对象的数组 该类所代表的类或接口的成员方法 对象,包括由类或接口声明的对象以及那些 继承自超类和超接口。 数组类返回 从 Object 类继承的所有(公共)成员方法。这 返回的数组中的元素未排序且不在任何 特定的顺序。如果这个方法返回一个长度为 0 的数组 类对象表示没有公共成员的类或接口 方法,或者如果此 Class 对象表示原始类型或 void。

     StringBuilder extends AbstractStringBuilder 
    
     AbstractStringBuilder implements Appendable
    

    这就是你得到 3 种方法的原因。

    【讨论】:

      【解决方案2】:

      当您调用 c.getMethods() 时,结果数组将包含在 StringBuilder 类及其超类/超接口中定义的所有方法。

      这就是为什么你得到三个而不是一个。

      这是否意味着 append 方法实际上在返回类型上重载?

      没有。重载是一个与方法签名定义密切相关的术语。方法签名包括

      • 方法名
      • 方法参数

      重载指定两个或多个方法同名,但方法签名不同。返回类型不是方法签名的一部分。

      在您的示例中,三个方法定义没有重载,而是一个相同方法抽象的覆盖版本。

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 2013-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 2011-10-28
        相关资源
        最近更新 更多