2009-12-12 45 views
1

在PHP(例如),你可以使用這個方法來調用使用可變這樣的功能:是否可以使用變量調用方法?

$funcname = "print"; 
$funcname("Whatever..."); // Same as: print("Whatever..."); 

什麼是Java中使用的方法是什麼?

+0

呃...像什麼? – 2009-12-12 16:23:46

+11

好神,你爲什麼要? – 2009-12-12 16:24:30

+0

對不起,修正了=] – 2009-12-12 16:24:52

回答

15

您可以使用

Class<?> klass = object.getClass(); 
Method method = klass.getMethod("name", String.class); // parameter types, if any 
method.invoke(object, "whatever"); // parameters, if any 

加樣板代碼來捕獲5種不同的例外(他們答應介紹Java 7的一個共同的超類型)。

+2

blurk!我只是趴在鞋子上。 – Cheeso 2009-12-13 04:21:07

+0

一個常見的超類型?哦,謝謝Java Java神...終於... – 2009-12-13 17:04:19

1

您可以使用反射,但是如果您希望有一個打印某些內容的方法,並且稍後想要更改該行爲,則只需編寫一個方法並調用該方法即可。

7

雖然你可以如許多人已經指出的那樣用反射來做這件事,對於你在評論中提到的用於回答問題「爲什麼?」的用例,我會用一個接口來代替。

17

請記住,這種反射在Java中並不典型,就像它在更多功能導向的語言中一樣,比如Ruby或甚至(等待它)的C#。技術本身沒有什麼問題,但是你確實失去了編譯器保護,這可能會導致難以發現的錯誤或者對於不期望這些路徑的其他開發人員造成混淆的代碼。我不是認爲Java中的所有反思都被認爲是有害的,但它絕對不是主流實踐。謹慎使用。

也許更好,更友善的解決方案是使用Command Pattern。使用「execute」方法創建一個類似功能的對象數組,以執行所需的各種操作。使用接口進行抽象。

public interface Command { 
    public void execute(); 
} 

public class Foo implements Command{ 
    public void execute() { 
     // do some stuff 
    } 
} 

您可以在具體的類或匿名內部類實現命令和遍歷命令的數組:

List<Command> commandArray = new <Command>ArrayList(); 
commandArray.add(new Foo()); 
commandArray.add(new Command(){ 
    public void execute() { 
     // some more stuff; 
    } 
}); 

for (Command command : commandArray){ 
    command.execute(); 
} 

編輯:每阿德里安的評論,這裏有一個方法,從調用的方法/命令

public interface StringCommand { 
    public void execute(String value); 
} 

stringCommand = new StringCommand(){ 
    public void execute(String value){ 
     System.out.println(value.toLowerCase()); 
    } 
} 

String[] stringAry = {"foo", "fu", "Whatever..."}; 

for(String value : stringAry){ 
    stringCommand.execute(value); 
} 

會在紅寶石類似於::

超過值的陣列的可變迭代
+0

-1 OP在評論中說,OP想要對數組中的所有元素應用相同的函數,即OP需要相當於Ruby的每個元素。你能改變你的例子來解決嗎? – akuhn 2009-12-13 11:25:54

+0

我明白你的觀點。怎麼樣? – 2009-12-13 14:02:44

+0

很好,非常感謝! – akuhn 2009-12-14 09:58:27

0

您可以像其他人所建議的那樣使用反射。從語法上來說,它和你所期望的完全不同。

0

下一個版本的JDK-JDK7可能會有關閉支持。 如果你不想等待2011年秋季正式發佈,你可以嘗試betta版本。谷歌的Java/JDK 7.

相關問題