Могу ли я создать экземпляр класса beanshell, полученный из другого сценария Beanshell?

Я хотел бы запустить класс, импортированный из другого файла beanshell. Но я понятия не имею, как создать экземпляр класса из основного файла beanshell. Это возможно?

Класс, который я импортирую:

class HelloW {
public void run(){
    print("Hello World");
}
}

Основной файл beanshell, который должен запускаться и создавать экземпляр класса:

Interpreter i = new Interpreter();
i.source("HelloW.bsh");

person PotOfTea    schedule 08.01.2013    source источник


Ответы (1)


документация по BeanShell довольно хороша в этой области, так что вам следует сначала прочитать ее. . В вашем случае проблем немного. Тем не менее, существуют заскриптованные объекты. Кроме того, файл .bsh, с которого вы начинаете, должен выполнять объект сценария. Взяв ваш пример, этот код должен работать:

Hello() {
 run(){
     print("Hello World");
 }

 return this;
}

myHello = Hello();
myHello.run(); // Hello World

*ОБНОВЛЕННЫЙ ответ для версии BeanShell 2.0b1 и более поздних версий, поддерживающих классы со сценариями *:

Я создал два файла beanshell и поместил их в каталог «scripts».

Я полагаю, что первый «executor.bsh» — это то, что вы называете «родительским» сценарием.

// executor.bsh

addClassPath(".");
importCommands("scripts");

source(); // This runs the script which defines the class(es)

x = new HelloWorld();
x.start();

Второй файл содержит сценарий класса. Обратите внимание, что я использую скриптовую команду и, согласно документации BeanShell, имя файла должно совпадать с именем команды.

// source.bsh

source() {
    public class HelloWorld extends Thread {
        count = 5;
        public void run() {
            for(i=0; i<count; i++)
                print("Hello World!");
        }

    }
}

Я вызвал executor.bsh в классе java с помощью:

Interpreter i = new Interpreter();
i.source("scripts/executor.bsh");

// Object val = null;
    // val = i.source("scripts/executor.bsh");
// System.out.println("Class:" + val.getClass().getCanonicalName());
// Method m = val.getClass().getMethod("start", null);
// m.invoke(val, null);

Обратите внимание, что я оставил некоторый код с комментариями, который также показывает, как я выполняю скриптовый класс из Java с использованием Reflection. И это результат:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
person GaryMcM    schedule 08.01.2013
comment
Извините, но вы неправильно поняли мой вопрос, этот класс Hello находится в отдельном файле bsh, и я вызываю его с помощью интерпретатора. - person PotOfTea; 09.01.2013
comment
Хм. Я ожидал, что вы поместите код, который я дал в HelloW.bsh, и назовете его так, как вы указали в вопросе. Если вы это сделаете, это создаст экземпляр объекта сценария и вызовет метод запуска. Файл, который вы даете интерпретатору, должен быть каким-то сценарием и выполнять действие. Вызов метода source() аналогичен вызову eval(), за исключением того, что сценарий поступает из файла, а не из строки. - person GaryMcM; 09.01.2013
comment
ОК, спасибо, я понял, я предполагаю, что нет способа запустить методы или создать экземпляр класса в родительском файле bsh (в основном импортировать файл с классами)? - person PotOfTea; 10.01.2013
comment
Я только что провел небольшую проверку, и если вы используете бета-версию 2.0b1 или b2, вы должны иметь возможность определять классы сценариев. Продукт, над которым я работаю, застрял на старой версии. Я обновил свой ответ, чтобы показать вам, как я сделал то, что, как я думаю, вы ищете. Я надеюсь, что это помогает. - person GaryMcM; 10.01.2013