在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中引入一个常见的超类型).
归档时间: |
|
查看次数: |
368 次 |
最近记录: |