Skip to content
This repository has been archived by the owner on Jun 7, 2019. It is now read-only.
Максим Тарасов edited this page May 12, 2019 · 1 revision

Внимание! Это расширение работает только с JDK (JavaDevelopmentKit), и не работает на JRE (JavaRuntimeEnvironment). Учитывайте это при роботе с ним!

Это расширение используется как дополнение к java-reflection-ext. Это расширение имеет всего один класс JavaCompiler который умеет компилировать java код из строки и возвращать ReflectionClass вашего класса.

Рассмотрим пример:

use java\reflection\ReflectionClass;
use java\reflection\ReflectionObject;
use java\reflection\ReflectionTypes; // Импортируем пакет рефлексии
use java\compile\JavaCompiler; // Импортируем волшебный класс

// Исходный код на Java
$javaCode = "package test;
import php.runtime.invoke.Invoker;
import php.runtime.Memory;

public class TestJavaCompiler {
    public TestJavaCompiler() {
        
    }

    public void print() {
        System.out.println(\"Hello, from Java!\");
    }
    
    public void callback(Invoker inv) {
        // Вызываем обратный вызов в jPHP
        inv.callNoThrow(Memory.NULL);
    }
}";

// Первым параметром передаём класс который мы хотим получить как ReflectionClass, вторым сам код на java
$clazz = JavaCompiler::loadFromJava("test.TestJavaCompiler", $javaCode);
$obj = $clazz->getConstructor([])->newInstance([]); // Теперь создаём наш класс
$clazz->getMethod("print", [])->invoke($obj, []); // Получаем метод print, и вызываем его

// Ну а теперь ситуация интереснее
// Можно делать обратные вызовы. Класс для них это: php.runtime.invoke.Invoker
$clazz->getMethod("callback", [
    ReflectionClass::forName("php.runtime.invoke.Invoker")
])->invoke($obj, [
    // Таким образом мы преобразовываем обратный вызов jPHP в класс Invoker
    ReflectionObject::fromCallback(function () {
        echo "Callback from jPHP!\n";
    })
]);
Clone this wiki locally