Создание новых объектов из JBF и исполнение произвольных методов.

 
+
-
edit
 

Balancer

администратор
★★★★★
Создание нового объекта:

code forth
  1. : test
  2.     player@ "ObjectId" p@
  3.     4625
  4.     3
  5.     player@ coords@ 50 coords-randomize
  6.     "net.sf.l2j.gameserver.serverpackets.Dice" 6 jnew
  7. ;


слово jnew ( arg1 arg2 ... argN "ClassName" N — Object ) создаёт новый объект, передавая ему N аргументов. Конструктор выбирается исходя из типа аргументов (Их число может быть и нулевым).

Помните, что int != Integer. Более того, боюсь, что слова с аргументами int вообще невозможно вызвать через Java Reflection. Так что, возможно, вам придётся переписывать некоторые классы с int на Integer.

Вызов метода, возвращающего результат:
code forth
  1. player@ "getAccessLevel" 0 jget


(хотя этот пример лучше писать в виде player@ "AccessLevel" p@)

Формат вызова: jget ( arg1 arg2 ... arg N object "MethodName" — result )

Аналогично используется и слово jexec, но оно не возвращает результата. Используется для вызова методов, не возвращающих результат.

внимание! конструкция вида
code forth
  1.   ( на входе объект Dice из предыдущего примера )
  2.   player@ "broadcastPacket" 1 jexec


Почему-то не работает :) Не находит нужный класс (BaseSystemPacket). Вероятно, нужно преобразовывать к нему принудительно. Подобные слова для преобразования к базовым классам, если возможны, напишу позднее. Пока для броадкаста используйте
code forth
  1.     ( ServerPacket ) player@ broadcast
 

Boris
Boris2

новичок
При вызове метода
надо использовать Class.getMethods()
стоит сначала искать по c точнам совпадением класов, а если не найдено потом с классами к которым приводяться передаваемые параметры. Причем приводяться в широком смысле слова. Т.е. проверять class.isAssignableFrom(..), кроме того отдельно обработать примитивные типы, и в идеале простейшие преобразования типов. Все это не исключат того что в конце однозначного ответа все равно не получиться, например если передан наловый параметр.
Если есть желание этот код можно выцепить в Commons JXPath - JXPath Home.

Если возиться облом можно сделать 2 метода
1. Искать по имени и к-ву параметров.
2. Заставить нас в коде кроме параметров передать еще и типы.
Мне кажеться что так будет и просто и гибко.
 
+
-
edit
 

Balancer

администратор
★★★★★
Вот вопрос, как передать тип int :) int, ведь, не наследник Object :) Передаётся по значению, а не по ссылке.
 

Boris
Boris2

новичок
Передавать все примитивные типы надо как соответствующие им не примитивные (для int Integer и т.д.). Возвращаеться, кстати, тоже соответствующий не примитивный тип.
Вопрос только в нахождении матода к-рый надо вызвать.
 
+
-
edit
 

Balancer

администратор
★★★★★
>Передавать все примитивные типы надо как соответствующие им не примитивные (для int Integer и т.д.).

Вот потому и приходится переписывать необходимые (int) медоты на (Integer) :) Иначе - не находятся.

>Вопрос только в нахождении матода к-рый надо вызвать.

Угу.
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru