2009-12-12 94 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.

相关问题