[英]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.