2017-03-31 11 views
0

searchValue이 RegEx 표현식 일 때 Rhino의 Java String 객체에서 .replace(searchValue, newValue)을 호출하는 데 문제가 있습니다. searchValue이 RegEx 표현식이 아니거나 JavaScript 내에서 시작된 String에 대해 메소드가 호출 될 때이 방식은 정상적으로 작동합니다.Rhino : Rhino에서 Java String에서 RegEx 표현식을 평가하는 방법은 무엇입니까?

예 :

샘플 자바 객체와

public class MyTestObject { 
    public String returnStringValue() { 
     return " This is a string with spaces "; 
    } 
} 

는 코뿔소의 설정 문자열을 반환하는 방법, 자바 객체

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 
    } 
} 

내 자바 스크립트 함수의 생성 (이 코드 을 수정할 수 없습니다.

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 엔진)를 사용해야합니다.

replace(char oldChar, char newChar); 

또는

replace(CharSequence target, CharSequence replacement); 

을 -

답변

0

내 생각 엔이 실행해야하는 경우 자바 코드가 모르는 따라서 String 클래스

replace(null, null); 

메서드를 호출하고 있다는 것입니다 Java 호출의 인수를 다음으로 이동합니다.

replace((CharSequence) null, (CharSequence) null); 
+0

자바 코드가 아니라 JavaScript 코드에서'.replace (val1, val2)'가 호출되기 때문에이 문제를 어떻게 해결할 수 있을지 모르겠다. returnStringValue()의 반환 값을 CharSequence로 변경하려고했지만 동일한 문제가 발생했습니다. – Pauline