Scala脚本引擎创建单例的另一个实例

布布尔坦

因此,我正在JSR 223为Scala创建一个脚本系统,但是遇到了这个问题,找不到任何原因。

有一个类似单例的类,该类具有添加事件侦听器(来自脚本)和调度事件(来自核心)的方法。一切正常,但是由于某种原因,当我必须调度事件时,添加的侦听器消失了。

重现问题后,我发现脚本引擎创建了单例的另一个实例:

这是我的Singleton课:

package test;

import java.util.Arrays;

public final class Singleton {

    private static final Singleton instance = new Singleton();

    private Singleton() {
        Arrays.stream(Thread.currentThread().getStackTrace()).forEach(System.out::println);
        System.out.println();
    }

    public static Singleton instance() {
        return instance;
    }
}

这是我的Main课:

package test;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public final class Main {

    public static void main(String[] args) throws ScriptException {

        ScriptEngine engine = new ScriptEngineManager().getEngineByName("scala");

        // this is a trick I found to access the classpath,
        // might be the problem
        @SuppressWarnings("rawtypes")
        scala.collection.immutable.List nil = scala.collection.immutable.Nil$.MODULE$;
        @SuppressWarnings("unchecked")
        scala.collection.immutable.$colon$colon<String> vals = scala.collection.immutable.$colon$colon$.MODULE$.apply("true", nil);
        ((scala.tools.nsc.interpreter.IMain) engine).settings().usejavacp().tryToSet(vals);

        engine.eval("test.Singleton.instance");
        Singleton.instance();
    }
}

这是输出:

java.lang.Thread.getStackTrace(Unknown Source)
test.Singleton.<init>(Singleton.java:10)
test.Singleton.<clinit>(Singleton.java:7)
$line3.$read$$iw$$iw$.<init>(<console>:8)
$line3.$read$$iw$$iw$.<clinit>(<console>)
$line3.$eval$.$result$lzycompute(<console>:5)
$line3.$eval$.$result(<console>:5)
$line3.$eval.$result(<console>)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:773)
scala.tools.nsc.interpreter.IMain$ReadEvalPrint.callEither(IMain.scala:777)
scala.tools.nsc.interpreter.IMain$ReadEvalPrint.evalEither(IMain.scala:792)
scala.tools.nsc.interpreter.IMain$WrappedRequest.eval(IMain.scala:613)
scala.tools.nsc.interpreter.IMain.eval(IMain.scala:1047)
javax.script.AbstractScriptEngine.eval(Unknown Source)
test.Main.main(Main.java:19)

java.lang.Thread.getStackTrace(Unknown Source)
test.Singleton.<init>(Singleton.java:10)
test.Singleton.<clinit>(Singleton.java:7)
test.Main.main(Main.java:20)

堆栈跟踪显示脚本引擎最终创建了的新实例Singleton,但我不知道为什么。

谢谢你。

布布尔坦

浏览源代码后找到修复程序:

((scala.tools.nsc.interpreter.IMain) engine).settings().embeddedDefaults(Main.class.getClassLoader());

这会将的更改ClassLoaderScriptEngine相同的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala脚本引擎创建单例的另一个实例

来自分类Dev

Scala单例作为另一个类的实例

来自分类Dev

Scala单例作为另一个类的实例

来自分类Dev

如何创建创建另一个脚本的脚本

来自分类Dev

如何创建创建另一个脚本的脚本

来自分类Dev

在另一个 Python 脚本中使用 POST 方法创建 Django 模型实例

来自分类Dev

从另一个实例创建新对象

来自分类Dev

创建另一个文件的新实例

来自分类Dev

MongoDB upsert创建另一个实例

来自分类Dev

创建另一个文件的新实例

来自分类Dev

在另一个类中创建该类的实例

来自分类Dev

创建一个脚本来创建另一个脚本

来自分类Dev

Guice:在创建模块之前实例化一个单例

来自分类Dev

无法确保仅以单例模式创建一个实例

来自分类Dev

是否可以创建一个维护实例字典的单例工厂类?

来自分类Dev

MVVMCross-在另一个程序集中自动注册单例

来自分类Dev

为什么不能将单例方法附加到另一个对象?

来自分类Dev

将另一个类的对象传递给单例类

来自分类Dev

为什么不能将单例方法附加到另一个对象?

来自分类Dev

MVVMCross-在另一个程序集中自动注册单例

来自分类Dev

快速的单例无法从另一个班级访问

来自分类Dev

试图打开另一个实例时,如何创建恢复打开窗口的单实例WPF应用程序?

来自分类Dev

在一个bean中作用域单例,并在另一个依赖bean中建立原型

来自分类Dev

如何从另一个GameObject实例化一个:monobehaviour脚本

来自分类Dev

如何从另一个GameObject实例化一个:monobehaviour脚本

来自分类Dev

如何实例化一个单例

来自分类Dev

如何创建一个在春季创建单例的工厂

来自分类Dev

如何创建一个在春季创建单例的工厂

来自分类Dev

从另一个类创建一个类的实例

Related 相关文章

  1. 1

    Scala脚本引擎创建单例的另一个实例

  2. 2

    Scala单例作为另一个类的实例

  3. 3

    Scala单例作为另一个类的实例

  4. 4

    如何创建创建另一个脚本的脚本

  5. 5

    如何创建创建另一个脚本的脚本

  6. 6

    在另一个 Python 脚本中使用 POST 方法创建 Django 模型实例

  7. 7

    从另一个实例创建新对象

  8. 8

    创建另一个文件的新实例

  9. 9

    MongoDB upsert创建另一个实例

  10. 10

    创建另一个文件的新实例

  11. 11

    在另一个类中创建该类的实例

  12. 12

    创建一个脚本来创建另一个脚本

  13. 13

    Guice:在创建模块之前实例化一个单例

  14. 14

    无法确保仅以单例模式创建一个实例

  15. 15

    是否可以创建一个维护实例字典的单例工厂类?

  16. 16

    MVVMCross-在另一个程序集中自动注册单例

  17. 17

    为什么不能将单例方法附加到另一个对象?

  18. 18

    将另一个类的对象传递给单例类

  19. 19

    为什么不能将单例方法附加到另一个对象?

  20. 20

    MVVMCross-在另一个程序集中自动注册单例

  21. 21

    快速的单例无法从另一个班级访问

  22. 22

    试图打开另一个实例时,如何创建恢复打开窗口的单实例WPF应用程序?

  23. 23

    在一个bean中作用域单例,并在另一个依赖bean中建立原型

  24. 24

    如何从另一个GameObject实例化一个:monobehaviour脚本

  25. 25

    如何从另一个GameObject实例化一个:monobehaviour脚本

  26. 26

    如何实例化一个单例

  27. 27

    如何创建一个在春季创建单例的工厂

  28. 28

    如何创建一个在春季创建单例的工厂

  29. 29

    从另一个类创建一个类的实例

热门标签

归档