Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 如何在接口使用反射中调用默认方法_Java 8 - Fatal编程技术网

Java 8 如何在接口使用反射中调用默认方法

Java 8 如何在接口使用反射中调用默认方法,java-8,Java 8,这样的接口,如果实现了该接口,并且有一个实例,如何调用默认方法?如果使用反射,怎么办? 我只有这个接口,没有Impl类,也没有Impl实例。如何调用默认方法?您可以通过反射访问接口默认方法,如下所示: public interface TestServiceIface { default String test(String str, int flag) { return str; } } 但是,如果子类重写默认方法,则将调用重写的方法,这意味着接口默认方法也支

这样的接口,如果实现了该接口,并且有一个实例,如何调用默认方法?如果使用反射,怎么办? 我只有这个接口,没有Impl类,也没有Impl实例。如何调用默认方法?

您可以通过反射访问接口默认方法,如下所示:

public interface TestServiceIface {
    default String test(String str, int flag) {
        return str;
    }
}
但是,如果子类重写默认方法,则将调用重写的方法,这意味着接口默认方法也支持多态性。

您可以通过反射访问接口默认方法,如下所示:

public interface TestServiceIface {
    default String test(String str, int flag) {
        return str;
    }
}
但是,如果子类重写默认方法,则将调用重写的方法,这意味着接口默认方法也支持多态性。

或通过MethodHandle,但请注意,您实际上需要该接口的实现类:

Class<TestServiceIface> type = TestServiceIface.class;

Method defaultMethod = type.getMethod("test", String.class, int.class);

String result = (String) defaultMethod.invoke(instance, "foo", 0);
以及用法:

static class Impl implements TestServiceIface {

}
或者通过MethodHandle,但请注意,您实际上需要该接口的实现类:

Class<TestServiceIface> type = TestServiceIface.class;

Method defaultMethod = type.getMethod("test", String.class, int.class);

String result = (String) defaultMethod.invoke(instance, "foo", 0);
以及用法:

static class Impl implements TestServiceIface {

}

对实例的类(例如instance.getClass.getMethodtest)使用反射不起作用?您的工作是什么?您可以像调用任何其他方法一样调用该方法,除非被重写。如果该方法已被重写,则没有正式方法可以绕过重写方法,该方法与任何其他方法一样。对实例的类(例如instance.getClass.getMethodtest)使用反射不起作用?您的工作是什么?您可以像任何其他方法一样调用该方法,除非被重写。如果该方法已被重写,则没有正式方法可以绕过重写方法,这与其他任何方法一样。如果我没有该接口的实现类,可以这样做吗?如果我没有该接口的实现类,可以这样做吗?您的实例来自何方?这是关键点,如果我想迭代实例类型,很简单,但这只是用于接口。您的实例来自哪里?这是关键点,如果我想迭代实例类型,很简单,但这只是用于接口