簡體   English   中英

調用類型為Class的對象的方法

[英]Invoke a method of an object of type Class

我會嘗試將其設置得盡可能簡單,因為它也會使我感到困惑。

我有一個方法返回Class類型的對象,即

public Class foo(){...}

當我調用此方法時,我會將結果保留在Class類型的變量中,即

Class obj = new foo();

foo()可以返回許多不同的類,但它們都包含相同的方法bar()

如何從obj變量調用該方法?

我嘗試了obj.bar()但IDE似乎不喜歡它。 我懂了

錯誤:(59,34)錯誤:找不到符號方法bar()

似乎您想對行為進行分組,這就是Java接口的作用:

interface Barer {
    String bar();
}

class Foo implements Barer {
    String bar() {
        return "I'm a Foo";
    }
}

class Fooz implements Barer {
    String bar() {
        return "I'm a Fooz";
    }
}

然后在您的代碼中可以有類似以下內容:

Barer obj;

if (something) {
    obj = new Foo();
} else {
    obj = new Fooz();
}

obj.bar()

實際上,將構造函數的返回值存儲在Class對象中幾乎沒有意義。


如果確實需要一個Class對象(請記住它只會指向Class而不是您創建的實例),則可以使用Java Reflection

Class obj = new foo();
Method method = obj.getDeclaredMethod("bar");
method.invoke(null);

如果方法foo()返回Class,則表示它不返回要在其上調用bar()方法的對象的實際實例,而是類本身,因此不可能將Class上的Class方法調用bar() .class沒有方法欄。

在您的代碼示例中有一些錯誤

Class obj = new foo();

關鍵字new表示您正在創建類的新實例,而不是在對象上調用方法。


實際上,正確的方法是使用接口。

聲明接口,而不是從foo方法返回Class,

public interface MyInterface {
  public void bar();
}

並使foo()返回MyInterface而不是Class。

那你可以做

MyInterface obj = tmp.foo();
obj.bar()

如果所有返回的值都是實現相同方法的類的對象,則應在單獨的接口中聲明該方法並讓他們實現。 稍后您可以使用通用通配符,例如<? extends BarInterface> <? extends BarInterface>或將返回類型更改為BarInterface

public interface BarInterface{
    public void bar();
}

public <T extends BarInterface> foo(){...}

要么

public BarInterface foo() {...}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM