You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was 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 вашего класса.
Рассмотрим пример:
usejava\reflection\ReflectionClass;
usejava\reflection\ReflectionObject;
usejava\reflection\ReflectionTypes; // Импортируем пакет рефлексииusejava\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";
})
]);