Обычный способ получить что-то вроде замыканий в Javascript - это использование анонимных внутренних классов. Это намного более многословно, но позволяет вам делать то же самое.
Runnable r = new Runnable(){
public void run(){
System.out.println("Hello, world!");
}
};
r.run(); // Prints "Hello, world!"
Вы можете даже ссылаться на переменные в методе включения, если они являются окончательными:
public static Runnable makeGreeter(final String who) {
return new Runnable() {
public void run() {
System.out.println("Hello, " + who + "!");
}
};
}
// ... elsewhere in your program...
Runnable r = makeGreeter("world");
r.run(); // "Hello, world!"
Это стандартный материал, который был в Java с самого начала. Runnable
- очень удобный интерфейс, который, согласно Javadocs, «должен быть реализован любым классом, экземпляры которого предназначены для выполнения потоком». Runnable
, конечно, может использоваться гораздо больше, чем потоки, и обычно (в JVM и других местах) используется как «нечто, что может быть выполнено» - во многом как функция в Javascript. Конечно, если вы хотите передать аргументы, вам придется создать свой собственный интерфейс, но они также могут быть реализованы анонимно. Например, используя @ Imagist's Function
interface :
interface Function {
Object call(Object[] arguments);
}
// ...
Function helloSayer = new Function(){
public Object call(Object[] args){
System.out.println("Hello, " + args[0] + "!");
}
};
helloSayer.call(new Object[]{ "world" }); // "Hello, world!"
Редактировать: Конечно, это не имеет ничего общего с отражением, но в вашем примере также нет отражения - только анонимная функция.