是否可以使用变量调用方法?

Mos*_*vah 1 java

在PHP(例如)中,您可以使用这种方式使用如下变量调用函数:

$funcname = "print";
$funcname("Whatever..."); // Same as: print("Whatever...");
Run Code Online (Sandbox Code Playgroud)

Java中使用的方式是什么?

Dav*_*ims 17

请记住,这种反射在Java中并不常见,就像它在更多面向函数的语言(如Ruby)甚至(等待它)C#中一样.这种技术本身并没有什么问题,但你确实失去了编译器保护,这可能导致难以发现的错误或混淆代码,因为其他开发人员不会预料到这些类型的路径.我并不认为Java中的所有反思都被认为是有害的,但它绝对不是主流实践.谨慎使用.

也许更好,更友好的Java解决方案是使用命令模式.使用"执行"方法创建一个类似函数的对象数组,该方法执行所需的各种操作.使用接口进行抽象.

public interface Command {
    public void execute();
}

public class Foo implements Command{
    public void execute() {
        // do some stuff 
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在具体类或匿名内部类中实现Command并迭代命令数组:

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();
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据Adrian的评论,这里是一种从迭代值数组的变量调用方法/命令的方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

在Ruby中类似于:

string_command = lambda {|value| puts value.downcase }
["foo", "fu", "Whatever..."].each { |value| string_command.call(value)}
Run Code Online (Sandbox Code Playgroud)


aku*_*uhn 15

您可以使用

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

加上样板代码来捕获5个不同的异常(他们承诺在Java 7中引入一个常见的超类型).

  • blurk!我刚刚穿上鞋子. (2认同)

T.J*_*der 7

虽然你可以像许多人所指出的那样用反射做这个,但是你在评论中提到的用例回应了评论"为什么?",我会使用一个界面代替.


Yac*_*oby 6

是.使用Method.invoke.这里还有一些例子