Как объявить функцию во время выполнения программы?

StackOverflow https://stackoverflow.com/questions/1411508

Вопрос

Это что-то вроде Reflection , где вы можете вызвать метод просто по его имени, а не по предварительно скомпилированному указателю на него.

Как и в JavaScript, вы можете:

var fun = function(){    alert("Hello World!");    }
fun();

Возможно ли что-то подобное в Java / J2ME? Как?

Другие советы

Обычный способ получить что-то вроде замыканий в 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 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!"

Edit: Конечно, это не имеет ничего общего с отражением, но в вашем примере это тоже не отражение - просто анонимная функция.

Вы после динамического создания методов или Reflection ?

Первое, что вы не можете сделать в Java, но можете использовать переводчика ( BeanShell , если хотите) Java).

Есть как минимум несколько способов:

Вы можете создавать классы во время выполнения с помощью BCEL , но вы должны сами создавать байт-коды. И верификатор JVM может отклонить ваш класс, если ваши байт-коды выглядят ненадежно. Не супер простое решение, но выполнимое.

Реализация Sun 6 в Java включает в себя Rhino , интерпретатор JavaScript, так что вы, возможно, сможете делать то, что вам нужно если вы готовы использовать немного JavaScript.

Я не слишком уверен в этом, но я полагаю, что если у вас установлен JDK, вы можете вызвать javac из вашей Java-программы. Вывод javac может быть загружен во время выполнения с помощью пользовательского класса ClassLoader .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top