質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1567閲覧

`javax.script.ScriptEngine`で、プロパティの値を参照できない理由

yuji38kwmt

総合スコア437

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/01/28 05:52

背景

javax.script.ScriptEngineでjsファイルを解析したいです。

jsで定義したC.versionの値を取得するため、次のようなコードを書きました。

js:sample.js

1var C = {version: "1.2.3"};

java

1engine.eval(new FileReader("sample.js")); 2Object a = engine.get("C.version"); //→null

しかし、getメソッドの値はnullでした。

次のように一時的な変数tmpに値を代入したら、値を取得することができました。

java

1engine.eval("tmp = C.version"); 2Object b = engine.get("tmp"); //→"1.2.3"

質問

なぜ、engine.get("C.version")では取得できなかったのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リファレンスによればこのメソッドを「任意のJavaScriptの式を評価できるもの」とは捉えない方がよさそうです。

「このエンジンの状態の値セットを取得します。値は、実装に応じて、setValueを使用して設定された値、またはScriptEngineの状態のほかの値になります。getBindings(ScriptContext.ENGINE_SCOPE).getと同じ結果になります。」

任意の式を評価した結果の値を参照したい場合はevalを使うとよいと思います。やってみると、

Object a = engine.eval("C.version");

で値が取れました。


ちょっと補足します(Oracle JDK8にはいっているエンジンを使ってます):

engine.get("C");

ならCの値が返ってきます。質問者さんが実行されたように

engine.get("tmp")

でもできるのですよね。要するにgetは単純に変数名だけを指定してその値を取ってくるという目的のもののようです。

C.version

は「Cという変数に入っているオブジェクトのversionというプロパティーを得る」ということなのでしょうから、単なる変数の参照ではなくJavascriptエンジンに式の評価をさせなければならないということだと思います。そのためgetはNGでevalならOKになるのでしょう。

実際にgetの中を見てみると「引数をキー名として、そのキーに対応する値があるか?」のような単純な処理しかしていないように見えました。

投稿2017/01/28 07:21

編集2017/01/28 07:39
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuji38kwmt

2017/02/11 14:55

遅くなって申し訳ありませんが、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問