Главная » Java » Создание объектов примеры реализации

0

Вы можете создавать объекты Java внутри реализаций родных методов с помощью функции execute_java_constructor:

HObject *execute_java_constructor(ExecEnv *ee, char *className, ClassClass *classObj, char *signature, …)

Создает новый объект указанного типа, задаваемого одним из двух параметров className или ClassObj (не используемый параметр должен быть равен NULL). Для создания объекта вызывается конструктор, описываемый строкой signature. За параметром signature следуют параметры конструктора.

Например, создание нового объекта типа Simple с помощью безаргументного конструктора класса происходит следующим образом:

execute_java_contructor(NULL, "Simple", NULL, "()")

В данном случае сигнатура конструктора выглядит тривиально. Чтобы воспользоваться конструктором, который получает один или несколько параметров, необходимо включить их типы в сигнатуру, и поместить их значения в нужном порядке после строки сигнатуры. Типы в строке сигнатуры аналогичны тем, которые возвращаются Class.getName, и используют односимвольные  сокращения для примитивных типов. Применяются следующие сокращения:

Z boolean

I  int

C char J  long B byte F  float S short

D double

Чтобы избежать конфликтов между именами классов/интерфейсов и этими буквами, типы объектов получают имена вида " Ltype" , где type — полное имя класса или интерфейса, в котором разделители-точки  заменяются косой чертой, а в конце ставится точка с запятой. Например, параметр, представляющий собой объект String, будет выглядеть как " Ljava/lang/String;"  . Для массивов указывается тип массива с префиксом [; так, массив значений типа long будет иметь тип " [J" . В многомерных типах используются несколько квадратных скобок. Массив String[][] будет выглядеть как " [[Ljava/labg/String;"  .

Если вам все же непонятно, как указать конкретный тип в такой строке, вы можете написать класс Java, создающий объект нужного типа, и вызвать для него метод getClass().getName(). Затем, если полученное имя является именем типа, замените все точки на /, поставьте L спереди и ; сзади, если эти символы отсутствуют.

Аргументы, которые представляют собой объекты, передаются в виде указателей на дескрипторы.

Ниже показано, как происходит создание двух объектов Attr; первый из них использует конструктор с одним аргументом, которому передается только имя, а второй — конструктор с двумя аргументами, которому сообщается исходное значение.

oneArgAttr = (struct HAttr *)

execute_java_constructor(EE(), "Attr", NULL, "(Ljava/lang/String;)", attrStr);

twoArgAttr = (struct HAttr *)

execute_java_constructor(EE(), "Attr", NULL, "(Ljava/lang/String;Ljava/lang/Object;)", attrStr, attrStr);

Точка с запятой выполняет функцию терминатора (завершающего символа) типа, а не разделителя параметров. Конструктор, получающий два параметра типа long и два параметра типа double, описывается строкой " (JJDD)" .

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии