gpt4 book ai didi

java - 尝试访问类成员时出错(使用Rhino)

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:29 25 4
gpt4 key购买 nike

尝试使用 Rhino 与两个非常简单的对象创建 Java/JS 链接,其中一个对象具有第二个类的实例作为一个成员。

运行下面的代码会出现以下错误:

org.mozilla.javascript.EcmaError:TypeError:找不到默认值对于对象。

问题似乎是从第二个对象中访问成员“a”。我也尝试过这样的 setter/getter :

public Object jsGet_a() {
return Context.toObject(a, this);
}

但我遇到了同样的错误。

new A().doSmth();工作正常,并输出“我正在做某事”新 B().a.doSmth();引发错误

任何人都可以帮我找到可能的解决方案吗?

谢谢!

<小时/>
public class Test {

public static class A extends ScriptableObject implements Scriptable {

public A() {
};

public String getClassName() {
return "A";
}

public void jsFunction_doSmth() {
System.out.println("I'm doing something");
};

}

public static class B extends ScriptableObject implements Scriptable {

private A a = new A();

public B() {
};

public String getClassName() {
return "B";
}

public void jsConstructor() {
}

public A jsGet_a() {
return a;
}

}

public static void main(String[] args) {
try {
Context cx = Context.enter();

Scriptable scope = cx.initStandardObjects(null, true);
ScriptableObject.defineClass(scope, A.class);
ScriptableObject.defineClass(scope, B.class);

cx.compileString("" +
"new A().doSmth();" +
"new B().a.doSmth();" +
"", "", 1, null).exec(cx, scope);

} catch (Exception e) {
e.printStackTrace();
}
}

}

最佳答案

这似乎有效:

  1. 将上下文和全局范围设为私有(private)静态变量。
  2. 为 A 类添加了 jsConstructor
  3. 在B类的jsConstructor中,在代码中创建了一个javascript对象。
  4. 使用了 Context.toObject(a, this); jsGet_a() 中返回类型为 Scriptable
  5. 最后,将 cx 分配给输入的上下文,并将范围分配给全局范围。

    public class Test
    {
    private static Context cx;
    private static ScriptableObject scope;

    public static class A extends ScriptableObject implements Scriptable {

    public A() {
    }

    public void jsConstructor() {
    }

    public String getClassName() {
    return "A";
    }

    public void jsFunction_doSmth() {
    System.out.println("I'm doing something");
    }

    }

    public static class B extends ScriptableObject implements Scriptable {

    private A a = new A();

    public B() {
    }

    public String getClassName() {
    return "B";
    }

    public void jsConstructor() {
    Scriptable scriptable = cx.newObject(scope, "A");
    this.put("a", this, scriptable);
    }

    public Scriptable jsGet_a() {
    return Context.toObject(a, this);
    }

    }

    public static void main(String[] args) {
    try {
    cx = Context.enter();

    scope = cx.initStandardObjects(null, true);
    ScriptableObject.defineClass(scope, A.class);
    ScriptableObject.defineClass(scope, B.class);

    cx.compileString("" +
    "new A().doSmth();" +
    "new B().a.doSmth();" +
    "", "", 1, null).exec(cx, scope);

    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

关于java - 尝试访问类成员时出错(使用Rhino),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5863810/

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