用Java编写Synthetic / Bridge方法

jav*_*thu 5 java reflection stubbing java-bridge-method

我正在编写一个应用程序,用于检查该方法是顺数还是桥接。为了测试该应用程序,我在存根中添加了各种方法。但是对于任何一种方法,该块都不会包含在测试用例中。存根包含诸如validate(Object o)等方法,其方法与其他任何普通的Java类一样。

我应该在存根中添加哪种方法,以便覆盖该行?

代码:

     Method[] methods = inputClass.getMethods();
        for (Method method : methods) {

        if (method.isSynthetic() || method.isBridge()) {
            isInternal = true;
        }
       // More code.
     }
Run Code Online (Sandbox Code Playgroud)

Jig*_*shi 4

Java 中的桥接方法是合成方法,是实现某些 Java 语言功能所必需的。最著名的示例是协变返回类型和泛型中的情况,即基本方法参数的擦除与所调用的实际方法不同。

import java.lang.reflect.*;

/**
 *
 * @author Administrator
 */
class SampleTwo {

    public static class A<T> {

        public T getT(T args) {
            return args;
        }
    }

    static class B extends A<String> {

        public String getT(String args) {
            return args;
        }
    }
}

public class BridgeTEst {

    public static void main(String[] args) {
        test(SampleTwo.B.class);
    }

    public static boolean test(Class c) {
        Method[] methods = c.getMethods();
        for (Method method : methods) {

            if (method.isSynthetic() || method.isBridge()) {
                System.out.println("Method Name = "+method.getName());
                System.out.println("Method isBridge = "+method.isBridge());
                System.out.println("Method isSynthetic = "+method.isSynthetic());
                return  true;
            }
        // More code.
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • 我认为它看起来像是用于协变返回类型。当超类方法返回 Object 且子类使用同变类型(例如字符串)覆盖时,这对于桥接和合成也会返回 true。我已经编写了代码,但无法在此评论空间中发布。 (2认同)