searchValue
がRegEx式の場合、RhinoのJava Stringオブジェクトで.replace(searchValue, newValue)
を呼び出すのに問題があります。 searchValue
がRegEx式でない場合、またはJavaScript内から開始されたStringでメソッドが呼び出された場合は、これは正常に機能します。Rhino:RhinoでJava文字列の正規表現を評価する方法
例:
サンプルJavaオブジェクトと文字列サイ、Javaオブジェクトの作成
import java.io.FileNotFoundException;
import javax.script.*;
public class TestRhino{
public static void main(String[] args) throws FileNotFoundException, ScriptException, NoSuchMethodException {
// Create my Java Object
MyTestObject testObject = new MyTestObject();
// Initiate the JavaScript engine
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
Compilable compEngine = (Compilable)engine;
// evaluate my JavaScript file; add my Java object to it
engine.eval(new java.io.FileReader("MyJavaScriptFile.js"));
engine.put("testObject", testObject); // this adds my Java Object to Rhino
// Invoke my javaScript function
Invocable inv = (Invocable) engine;
Object returnVal = inv.invokeFunction("testFunction");
// print out the result
System.out.println(returnVal); // should print "ThisisaString" to the console
}
}
マイJavaScript関数(このコードのセットアップ
public class MyTestObject {
public String returnStringValue() {
return " This is a string with spaces ";
}
}
を返すメソッドはに変更できません)。
function testFunction() {
let myString = testObject.returnStringValue();
return myString.replace(/\s/g,""); // Error!
}
これはエラーThe choice of Java constructor replace matching JavaScript argument types (function,string) is ambiguous; candidate constructors are: class java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence)
をスローします。
ただし、JavaScript関数を次のように変更すると、Rhinoは期待値を返し、エラーはスローされません。
function testFunction() {
let myString = testObject.returnStringValue();
return myString.replace("T", "P"); // Phis is a string with spaces
}
次のJavaScript関数は、Rhinoで呼び出されたときにも機能します。
function testFunction() {
return " This is a string with spaces ".replace(/\s/g,""); // Thisisastringwithspaces
}
JavaScriptコードを変更せずに上記の作業を行う方法を探しています。 Javaコードのみを変更できます。
注:これはNashorn(Java1.8以降のデフォルトのJavaScriptエンジン)でうまくいきますが、Rhino(Java 1.7までのデフォルトのJavaScriptエンジン)を使用する必要があります。
JavaコードからではなくJavaScriptコードから '.replace(val1、val2)'が呼び出されるので、これは妥当と思われますが、この問題をどのように解決できるかはわかりません。 returnStringValue()の戻り値をCharSequenceに変更しようとしましたが、同じ問題が発生しました – Pauline