gpt4 book ai didi

java - 从 JavaScript 调用 @JSFunction,TypeError : Cannot find default value for object

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:51 25 4
gpt4 key购买 nike

我正在调用 ScriptableObject@JSFunction 注释方法

JavaScript 文件

Target = Packages.com.acme.rhino.Target;

function evaluate() {
var t = Target();
t.addModifier("foobar", 1);
return t;
}

Java 文件

public class Target extends ScriptableObject {
private static final long serialVersionUID = 1L;
public List<Modifier> modifiers = new LinkedList<>();

@JSConstructor
public Target() {
}

@JSFunction
public void addModifier(final String message, final int value) {
modifiers.add(new Modifier(message, value));
}

public int getValue() {
int sum = 0;
for (final Modifier modifier : modifiers) {
sum += modifier.getValue();
}
return sum;
}

@Override
public String getClassName() {
return "Target";
}
}

但是我明白了

org.mozilla.javascript.EcmaError: TypeError: Cannot find default value for object.
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
at org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3693)
at org.mozilla.javascript.ScriptRuntime.typeError1(ScriptRuntime.java:3705)
at org.mozilla.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:976 )
at org.mozilla.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:895 )
at org.mozilla.javascript.ScriptRuntime.toString(ScriptRuntime.java:761)
at org.mozilla.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:3774)
at org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime. java:2269)
at org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime. java:2251)
at org.mozilla.javascript.optimizer.OptRuntime.callProp0(OptRuntime.java:83)
at org.mozilla.javascript.gen.script_5._c_evaluate_1(script:6)
at org.mozilla.javascript.gen.script_5.call(script)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
at org.mozilla.javascript.gen.script_5.call(script)

不知道从那里去哪里。当我不调用 addModifier 方法时,给定的代码有效,并且在堆栈跟踪中给出错误 notFunctionError 我认为 Rhino 不会将给定的方法解释为JavaScript 函数。

  • 操作系统 10.8.2
  • Java 7
  • 犀牛 1.7R4

可以找到重现错误的完整Maven工程here

最佳答案

tl;dr 请参阅 these two 替代方案。

上述方法的问题是 Target.prototype 没有在脚本范围内正确设置。有关如何在脚本范围内正确定义原型(prototype)的详细信息,请参阅静态 ScriptableObject.defineClass() 方法。

为脚本提供 Target 构造函数有多种选择。 first alternative 将始终为所有脚本定义 Target 构造函数。如果您提前知道您希望 Target 全局可用,则此方法很有效。这基本上归结为以下几点:

final Context context = Context.enter();
try {
final ScriptableObject scope = context.initStandardObjects();
ScriptableObject.defineClass(scope, Target.class, false, true);
context.evaluateString(scope, script, "script", 1, null);
// etc.
} finally {
Context.exit();
}

相反,如果您希望脚本作者决定需要哪些构造函数,则 second alternative 将为脚本提供 defineClass 函数。有了这个功能,脚本作者可以在他们的类路径上“导入”任何可编写脚本的对象(这可能比您想要允许的要多)。要为脚本提供 defineClass 函数,请在进入上下文后执行以下操作:

final Context context = Context.enter();
try {
final ScriptableObject scope = context.initStandardObjects();
scope.defineFunctionProperties(
new String[] {"defineClass"},
Global.class,
ScriptableObject.DONTENUM);

context.evaluateString(scope, script, "script", 1, null);
// etc.
} finally {
Context.exit();
}

然后,JavaScript 作者通过以下方式使用 Target 构造函数:

defineClass("com.acme.rhino.Target");
// whatever `getClassName()` returns is now available
var target = new Target();

在上面的两个分支中,如果您向 Target 构造函数添加更多内容,我还进行了一些其他更改,这些更改会让您设置得更好。零参数构造函数不需要 @JSConstructor 注释。如果您稍后想要一个接受参数的构造函数,这个零参数构造函数将用作原型(prototype)构造函数,您可以在将用于初始化对象的方法上使用 @JSConstructor 注释.根据您编写此构造函数方法的方式,在 JavaScript 中使用 new 关键字将变得很重要。

简而言之,Packages.com.acme... 语法不能用于从脚本访问ScriptableObject 构造函数。

关于java - 从 JavaScript 调用 @JSFunction,TypeError : Cannot find default value for object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14561874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com