我想运行从不同 beanshell 文件导入的类。但我不知道如何从主 beanshell 文件中实例化类。这可能吗?
我导入的类:
class HelloW {
public void run(){
print("Hello World");
}
}
应该运行和实例化类的主 beanshell 文件:
Interpreter i = new Interpreter();
i.source("HelloW.bsh");
BeanShell 文档在这方面非常出色,因此您应该先通读一遍。在您的情况下,几乎没有问题。也就是说,有脚本对象。此外,您开始使用的 .bsh 文件需要执行脚本化对象。以您的示例为例,此代码应该可以工作:
Hello() {
run(){
print("Hello World");
}
return this;
}
myHello = Hello();
myHello.run(); // Hello World
*更新了支持脚本类的 BeanShell 2.0b1 及更高版本的答案 *:
我创建了两个 beanshell 文件并将它们放在一个目录“脚本”中。
我相信,第一个“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!");
}
}
}
我在一个 java 类中调用了 executor.bsh:
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 执行脚本类。这是结果:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!