This repository has been archived by the owner on Jun 7, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Максим Тарасов 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";
})
]);