Как вызвать пользовательский метод не-stati c Java от Ballerina - PullRequest
0 голосов
/ 06 апреля 2020

В примере [1] показано, как вызвать метод Java. Но в моем случае мне нужно вызвать свой собственный метод из моего собственного класса. Примерно так:

Привет. java

public class Hello {
    public String sayHello() {
        return "Hello . . .";
    }
}

hello_ java .bal

import ballerina/io;
import ballerina/java;

function sayHelloJava() returns handle = @java:Method {
    name: "sayHello",
    class: "Hello"
} external;


public function main() {
    var txt = sayHelloJava();
    io:println(txt);
}

При запуске я получаю следующее исключение

Compiling source
        hello_java.bal
error: .::hello_java.bal:4:1: {ballerina/java}CLASS_NOT_FOUND 'Hello'
Running executables

Error: Could not find or load main class ___init

оба файла .class и .bal находятся в одном каталоге

Может кто-нибудь сказать, пожалуйста, правильный синтаксис для вызова метода sayHello java в балерине.

Также не могли бы вы подробнее рассказать о ключевом слове handle в балерине

[1] https://ballerina.io/v1-2/learn/by-example/invoke-java-methods.html

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

Подробную информацию об этом вы можете найти в руководстве по взаимодействию .

Для вашего конкретного случая выполните следующие шаги:

  • Создайте проект Java для вашего класса Hello и получите встроенный файл .jar.
  • Создайте новый проект Ballerina и добавьте в него модуль (скажем, модуль называется hello).
  • Создайте каталог с именем javalibs в каталоге вашего проекта root и скопируйте .jar файл к нему.
  • Ваш каталог проекта выглядит примерно так:

    .
    ├── Ballerina.lock
    ├── Ballerina.toml
    ├── javalibs
    │   └── hello-1.0-SNAPSHOT.jar
    └── src
        └── hello
            └── main.bal
    
  • Добавьте следующие записи в ваш файл Ballerina.toml :

    [platform]
    target = "java8"
    
       [[platform.libraries]]
       path = "./javalibs/hello-1.0-SNAPSHOT.jar"
       modules = ["hello"]
    
  • Ваш код балерины должен выглядеть примерно так:

    import ballerina/io;
    import ballerina/java;
    
    public type Hello object {
        public function sayHello() returns string? {
            return java:toString(sayHelloExtern());
        }
    };
    
    function sayHelloExtern() returns handle = @java:Method {
        class: "xyz.pubudu.Hello",
        name: "sayHello",
        paramTypes: []
    } external;
    
    
    public function main() {
        Hello h = new;
        io:println(h.sayHello());
    
        string? s = java:toString(sayHelloExtern());
        io:println(s);
    }
    
  • Теперь вы можете запустить это с помощью ballerina run hello и он должен напечатать Hello . . .

С выпуском 1.2.0 был представлен новый инструмент CLI под названием bindgen, чтобы легко генерировать привязки Ballerina для API Java, чтобы пользователь мог не нужно вручную писать привязки, как мы сделали выше. Ознакомьтесь с руководством по взаимодействию, на которое я ссылался выше, для получения более подробной информации.

0 голосов
/ 09 апреля 2020

Добавляя к ответу @ pubudu, я просто хочу показать, как вызывать несталический метод c Java в Ballerina.

Поскольку ваш метод sayHello не является статичным c метод, вам нужно создать экземпляр класса Hello с помощью аннотации java:Constructor в балерине.

Тогда ваша функция sayHello должна взять этот созданный экземпляр (значение handle, возвращаемое из java:Constructor функция взаимодействия) в качестве первого параметра.

Ваш код балерины должен выглядеть следующим образом:

import ballerina/io;
import ballerina/java;

function newHello() returns handle = @java:Constructor {
    class: "Hello"
} external;

function sayHello(handle helloObject) returns handle = @java:Method {
    class: "Hello"
} external;

public function main() {
    var helloObj = newHello();
    io:println(java:toString(sayHello(helloObj)));
}
...