如何显式调用默认方法,没有反射和动态代理?

问题描述:

我正在阅读有关Java 8中的默认方法,而且我陷入了一件事 - 有没有一种方法可以从界面调用默认方法而不实现它,或者使用动态代理?只用一个简单的方法,就像下面的方法:如何显式调用默认方法,没有反射和动态代理?

interface DefaultTestInterface{ 
    default void method1(){ 
     //default method 
    } 
} 
class ImplementingClass implements DefaultTestInterface{ 
    public void method1(){ 
     //default method invocation in implementing method 
     DefaultTestInterface.super.method1(); 
    } 
    void method2(){ 
     //default method invocation in implementing class 
     DefaultTestInterface.super.method1(); 
    } 
} 
public class Main { 
    public static void main(String[] args) { 
     //is there any way to simply invoke default method without using proxy and reflection? 
    } 
} 

我看过类似的问题,但first在实现方法只调用连接,另外两个与dynamic Proxy using reflection reflection连接。

这些解决方案相当复杂,我想知道是否有更简单的方法。我也阅读了这些文章,但是我没有找到解决我的问题的方法。我会很感激任何帮助。

+4

所以你想使用一个没有实例的实例方法??? – f*

+1

你的问题存在一些困惑。 java 8接口的*默认方法*已经是一个实现。如果您没有需要不同实现的类特定行为,则只需实现该接口,然后省略要用作默认的方法。如果您想从* interface *中调用方法,而不是考虑使用* static *关键字来定义它,请改为。 –

+0

没有@f*,我正在考虑以某种方式包含实例化的解决方案。 –

如果接口只有一个方法,或者它的所有方法都默认实现,所有你需要做的就是创建一个匿名实现,它实现您要呼叫的方法:

(new DefaultTestInterface() {}).method1(); 

Demo.

+0

谢谢,这正是我正在寻找的解决方案。 –

+0

@MichałSzewczyk:你的问题明确地说“*不实施它*”,而这个答案*就是实施它。这根本没有任何意义。它归结为你真的问过“我如何实现一个接口?”...... – Holger

+1

@Holger从技术上讲,你是绝对正确的:这*是接口的实现。然而,这种退化的实现看起来并不像一个实现 - 事实上,我确信包括我自己在内的许多程序员不会在粗略阅读中发现实现。 – dasblinkenlight