Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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中实现接口?_Java - Fatal编程技术网

运行时类是否在Java中实现接口?

运行时类是否在Java中实现接口?,java,Java,假设我有这样的课程: class A { } 我可以通过任何方式使类实现运行时上的接口 这就是我试图实现的,当有人创建类A的对象时,我需要拦截对该对象的调用 非常熟悉Java,谢谢 不能使类在运行时实现接口。在运行时可以做的最好的事情是创建类的动态子类,它还实现了一个接口 根据Liskov替换原则,此解决方案将非常有效,因为针对类型A编写的任何代码也将针对其子类型。此外,针对您正在实现的接口编写的任何代码也可以工作,并且能够访问在类A中实现的行为,通过接口方法的行为反映此行为的程度。您可以使用

假设我有这样的课程:

class A
{
}
我可以通过任何方式使类
实现
运行时上的接口

这就是我试图实现的,当有人创建类
A
的对象时,我需要拦截对该对象的调用


非常熟悉Java,谢谢

不能使类在运行时实现接口。在运行时可以做的最好的事情是创建类的动态子类,它还实现了一个接口


根据Liskov替换原则,此解决方案将非常有效,因为针对类型
A
编写的任何代码也将针对其子类型。此外,针对您正在实现的接口编写的任何代码也可以工作,并且能够访问在类
A
中实现的行为,通过接口方法的行为反映此行为的程度。

您可以使用代理对象在运行时调整任何对象,使其看起来好像实现了接口一样

有一篇很好的文章讨论了对对象执行此操作的工厂方法


本质上,可以通过截取对对象的所有方法调用并动态重定向来使用对象包装对象。

这应该可以通过适配器解决。定义一个实现接口并委托给真实对象的其他类:

class YourAdapter implements YourInterface {

    private final YourClass realObject;

    public YourAdapter(YourClass realObject) {
        this.realObject = realObject;
    }

    @Override
    public methodFromInterface() {            
        realObject.methodFromInterface();
    }

    // .......

}
现在,给定一个需要
YourInterface
和类型为YourClass的对象的方法:

void someMethod(YourInterface param) {}

void test() {
    YourClass object = getFromSomewhere();
    someMethod( YourAdapter(object) );
}
第二种方式: 使用代理类:

参考链接

当然,您可以使用动态代理动态实现一个接口,但是除非您非常了解Java和字节码,并且没有其他选择,否则我不会这样做

更好的选择是使用组合或继承

class A {
}

class B extend A implement I {
     // B is an A and implements I
}
A a = new B();

class C implement I {
     A a;
}

B或C实现您的接口而不必更改A。

write
class A实现接口B
No。您为什么要这样做?该类要么实现接口定义,要么不实现。请具体说明您希望通过该命令实现什么。@KonstantinV.Salikhov显然,他希望在运行时实现,而不是在编译时实现……您希望通过在运行时实现接口实现什么?这是一种类型声明,通常会严重影响您编写类的方式。@user902383这在基于Spring的应用程序中非常常见,在基于Spring的应用程序中,动态代理被创建,用于实现其他特定于框架的接口。这是一个完全合法的请求,许多程序员只是在不知情的情况下使用它。@JamesB代码示例特定于动态类创建库;这会有点重,也不会有太大帮助,因为在实践中,这些操作是由框架执行的,而不是由客户机代码执行的。