【问题标题】:Check if object has method in Java?检查对象是否在Java中有方法?
【发布时间】:2012-06-01 23:42:37
【问题描述】:

我对 Java 的经验并不是很丰富,目前我的知识足以让我通过,但我还不完美,所以如果这是一个愚蠢的问题,我深表歉意。

我正在尝试编写一个可以将任何类型的对象传递给它的类,但我需要检查传递的对象是否具有特定的方法。我将如何进行测试?

我希望这是有道理的。干杯。

编辑

感谢所有快速回复!我对接口等不太熟悉,所以我不完全确定如何使用它们。但是,为了更好地了解我在做什么,我正在尝试创建一个会影响对象 alpha 的类,例如ImageViewTextView 例如。当我只需要确保它们具有.setAlpha() 方法时,我将如何为此创建一个接口,而不单独列出每个对象?这有意义吗?干杯。

【问题讨论】:

  • 这是非常非 Java 风格的。你会为此使用反射。一个更好的方法是需要一个接口。

标签: java android reflection methods


【解决方案1】:

首先,定义一个接口,要求所有实现它的对象都实现setAlpha() 方法:

public interface AlphaChanger {
    public void setAlpha(int alpha); // concrete classes must implement this
}

然后,定义实现这个接口的类:

public class Thing implements AlphaChanger {
    public void setAlpha(int alpha) { // must be present
        // implementation
    }
}

现在您可以要求传递给您的方法的所有对象都必须实现AlphaChanger 接口:

public void yourMethod(AlphaChanger changer) {
    changer.setAlpha(10); // you know for sure the method exists
}

【讨论】:

  • 谢谢拉杜,我想这就是我需要的。非常感谢您的帮助,我不知道从哪里开始,而不久前,我尝试查看接口,这让我很头疼..这很好地简化了它。再次感谢您。
  • 好的,回到我的愚蠢问题。我已经尝试过实现它,但我不完全确定如何实现。我在文件AlphaChanger.java 中有接口,然后在另一个文件中有Thing 类,我有一个更改alpha 的方法,使用@987654328 @ 作为类型转换。但是,当我使用yourMethod([ImageView object here]) 时,它会抛出一个错误,指出ImageView 不起作用,因为它需要是AlphaChanger 类型。基本上,我如何使用或实现此代码?愚蠢的问题,我知道,但我想不通:(
  • @Spiritfyre,ImageView 类(或您传递给该方法的任何对象)必须实现 AlphaChanger:class ClassName implements AlphaChanger
  • 它有。我是否需要创建ImageView 类的新版本,以及我希望通过它的每个类,以便它们可以实现AlphaChanger
  • @Spiritfyre,好吧,如果你想要传入的类还没有实现你的接口,那么你可以编写一个包装器来实现你的接口(例如,class AlphaChangerImageView extends ImageView implements AlphaChanger { public void setAlpha(int alpha) { ... } })。唯一的要求是,无论你传入什么,都必须实现接口,从而确保它实现了接口中定义的方法。
【解决方案2】:

一个更好的主意是使用该方法创建一个接口并将其设为参数类型。传递给您的方法的每个对象都必须实现该接口。

这称为与客户表达您的合同。如果您需要该方法,请说出来。

【讨论】:

  • 你不必那样转换,因为它已经是接口类型了。只需调用您说需要的方法即可。
  • 我刚才说是输入到那个界面的。你不能只传递任何对象;它必须实现该接口。这就是里氏替换原则。
  • 这就是合同是进口的原因。没有假设,没有猜测。
【解决方案3】:

您可以尝试像这样列出类的方法(例如:FooBar 类):

Class fooBar= FooBar.class;
Method[] methods = fooBar.getDeclaredMethods();
if (methods.length == 0){
...
} else{
...
}

【讨论】:

    【解决方案4】:

    您可以使用 Java 反射来做到这一点。

    类似object.getClass().getMethods() 来获取Method 对象的数组,或者您可以使用getMethod() 来获取具有特定名称的对象(您必须定义参数)。

    【讨论】:

      【解决方案5】:

      使用Object.getClass() 获取实例的类,然后使用Class.getMethod(String, Class...),如果该类没有该方法,则捕获NoSuchMethodException

      另一方面,这在 Java 中并不是一个很好的做法。尝试改用接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 2017-02-24
        • 1970-01-01
        • 2019-11-02
        • 2010-10-08
        • 1970-01-01
        相关资源
        最近更新 更多