如何在java中实现接口类

Posted

技术标签:

【中文标题】如何在java中实现接口类【英文标题】:How to get implementing interface class in java 【发布时间】:2017-05-15 14:13:34 【问题描述】:

我的问题非常接近 Java 通知/观察者设计模式。我从事不同的 java / android 编程。我想了解的一件事是发布者如何知道实现给定接口的类是什么。例如,在 android 中,当相机准备好时,如果您实现特定接口,则会调用一个方法。当相机打开而不将我的类注册到android时android如何调用此方法方法。

class mydevice implements camerainterface

    public void cameraup()
    // Implementing my logic when camera up. How android know that there is class //mydevice which is implementing my interface
    


android 如何知道我的类 mydevice 并调用这个 cameraup 方法。

我希望,我详细解释了我的问题以便理解。

【问题讨论】:

在java中可以通过if (myObject instanceof FooInterface)查看对象是否实现了接口。 他在问底层系统如何知道它必须调用他的类,因为它实现了接口 @TimCastelijns 那么问题是关于映射吗?类似于 web 应用程序中的 web.xml? 是正确的,我想了解底层系统知道它。在特定的 jar / Packages 中可能有 100 个类的 .但是在 100 个类中,5 个类可能实现了该接口。 android 代码如何找到这些类并调用该实现的方法。 请遵守 Java 命名约定。 【参考方案1】:

在观察者模式中,发布者将根据需求而不是订阅者定义合同(接口及其方法)。订阅者将实现接口并将它们自己注册为订阅者对象。

但在您的情况下,您是订阅者,并且您正在尝试定义不是观察者模式的合同(相机接口)。

首先,您必须检查哪个 Broadcast 或 Callbacks Android(在我们的例子中为 Publisher)提供了您的要求,并且您必须实施该合同以注册为订阅者。

希望这会有所帮助。

【讨论】:

感谢您的回复,让我作为我的问题更具体。developer.android.com/reference/android/hardware/…。在链接中,我以接口 Camera.PreviewCallback 作为示例。此接口具有称为 onPreviewFrame(byte[] data, Camera camera) 的方法。当相机屏幕预览发生变化时,将调用此方法。当我编程我的工作只是为了实现那个接口和方法。每当相机框架发生变化时,它就会被执行。我在做什么。我的问题是 android 如何知道我已经实现了该接口并调用了我的方法。 1) 为了使用 android.hardware.Camera 和它的 api,我们必须调用 open(int cameraId) 方法和相机对象(例如:cameraObject)。 2) Camera 公开了一个方法 setPreviewCallback(Camera.PreviewCallback),它接受任何类型为 Camera.PreviewCallback 的对象。在第 1 步中,我们已经有了对 Camera 的引用,我们可以使用 cameraObject.setPreviewCallback(Camera.PreviewCallback) 注册实现 Camera.PreviewCallback 的客户端对象。这是我们为客户订阅相机硬件的地方。这里 android.hardware.Camera 是 Publisher。【参考方案2】:

如果我正确理解了您的问题,您正在混合 interfacebroadcasting

粗略地说,接口从不知道哪些类正在实现它。

如果您创建实现了cameraInterfacemyDevice,只要Android 不知道它必须对这个类做些什么,它就不会做任何事情。有一点你必须告诉 Android 使用哪个类,否则它的内容将永远不会被触发。

广播是当你告诉Android“有那个类必须知道一个事件。当这个事件发生时触发它的特殊方法。”。例如,如果您想在打开相机时触发一些代码(我认为这是不可能的,但这只是一个示例),那么您必须将您的类声明为 BroadcastReceiver 并在 Manifest.xml 中指定。 xml 它应该监听哪些事件。

【讨论】:

如果你创建 myDevice 来实现 say cameraInterface,只要 Android 不知道它必须对这个类做些什么,它就不会做任何事情。他在问如何android 知道这一点,而不是接口或广播是什么 根据 cmets 的说法,这是 OP 必须注意的事情,因为这似乎并不完全清楚。 “这个”和“那个”是什么意思? OP 似乎想知道 Android 如何知道一个接口已经实现,以触发相应的代码。我帖子的第二行解释了为什么不能这样做。这篇文章的其余部分解释了如何实现它来做同样的事情。 感谢您的回复,让我作为我的问题更具体.developer.android.com/reference/android/hardware/...。在链接中,我以接口 Camera.PreviewCallback 作为示例。此接口具有称为 onPreviewFrame(byte[] data, Camera camera) 的方法。当相机屏幕预览发生变化时,将调用此方法。当我编程我的工作只是为了实现那个接口和方法。每当相机框架发生变化时,它就会被执行。我在做什么。我的问题是 android 如何知道我已经实现了该接口并调用了我的方法。【参考方案3】:

你的问题对我来说似乎很广泛,所以我会尝试采取不同的方式。您试图引用的概念并非特定于 Java。一般来说,它适用于任何时候传递对象的虚引用,并在运行时由编译器处理。

发生的情况是,每当您将引用作为接口(或父抽象类)传递时,具体对象的引用就会存储在所谓的虚拟查找表或 vtable 中。

看看this

因此,当发布者引发事件时,对发布者具体对象的引用将存储在 vtable 中,并作为接口传递给观察者。您可以将接口视为指向实际对象的指针。

【讨论】:

【参考方案4】:

android如何知道我的类mydevice并调用这个cameraup方法?

当您询问您的 JVM 是如何知道您的类实现 cameraInterface 时,他们可以简单地使用 instanceof 关键字,例如 if (myDeviceObject instanceof cameraInterface)

编辑看来您要问的更多是配置问题:

你应该看看this link,上面写着

您可以使用 Context.registerReceiver() 动态注册此类的实例,也可以使用 AndroidManifest.xml 中的标记静态声明实现。

好吧,这很好地总结了类注册在 Android 中的工作原理。要么你从 Context 注册你的类,你的框架为你做了,要么它在你的 AndroidManifest.xml 中定义

对于“您的框架为您完成”部分:您应该搜索dependency injectionannotation for injection。它可以用来向编译器指示它应该扫描类以找到接口的实现。

【讨论】:

你的意思是JVM会扫描Jar中的所有类来查找哪个类实现了哪些接口并注册它们? 添加更多,例如,我开发了一个 API,该 API 中有一个名为 weatherupdate 的接口,它具有抽象方法 changeweather() 。如果有人想知道天气变化信息,他们需要实现weatherupdate 更新类和changeweather(int c) 方法。我如何需要通知我的接口实现的所有类并为它们提供更新。我不希望他们像 set_listener 一样注册他们的课程。只需简单地实现我的接口,当天气变化时将调用它。

以上是关于如何在java中实现接口类的主要内容,如果未能解决你的问题,请参考以下文章

如何在基类中实现子类迭代器的统一接口?

用相同的方法在一个类中实现两个接口。哪个接口方法被覆盖?

扩展三个在Java中实现接口的类

如果它确实需要有接口a或者我可以在这个类中实现,那么创建接口

在python中实现类接口的正确方法是啥

如何让一个类在 Typescript 中实现调用签名?