2013-02-11 33 views
5

Bir Java yöntemini rastgele komut dosyaları ile çağrılabilmek için açığa çıkarmak istiyorum. Komut, daha sonra, dönüş değeri üzerinde aritmetik işlemleri gerçekleştirebilmelidir.Rhino: JavaScript tarafından çağrılan Java yönteminden bir Tamsayı nasıl döndürülebilir?

Sorun, açık olan yöntem bir Java Integer döndürse de, komut dosyası aslında normal bir sayı almaz, ancak org.mozilla.javascript.NativeJavaObject örneğidir. İşte

davranışı gösteren bazı basitleştirilmiş bir test kodu:

public class RhinoTest 
{ 
    public static void main(String[] args) 
    { 
     String script = "foo.getBar() + 1"; 
     Context context = Context.enter(); 
     ScriptableObject scriptableObject = context.initStandardObjects(); 
     ScriptableObject.putProperty(scriptableObject, "foo", new Foo()); 
     Object result = context.evaluateString(scriptableObject, script, "FooBar", 1, null); 
     Context.exit(); 
     System.out.println(result); 
    } 

    public static class Foo 
    { 
     public Integer getBar() 
     { 
      return 9; 
     } 
    } 
} 

beklenen sonuç 10 olmakla senaryo 91 döndürür.

Peki, komut dosyası içinde gerçekleşen getBar() çağrılarını nasıl yapabilirim normal bir Javascript veri türü döndürüyor? Lütfen, script kodunu unwrap() çağrıları, veya benzeri ekleyerek değiştirmek istemediğimi unutmayın.

+0

deneyin '¨foo.getBar()' + 1 – subodh

cevap

3

Contextinize WrapFactory değiştirin:

context.getWrapFactory() 
     .setJavaPrimitiveWrap(false); 
-2
public static void main(String[] args) 
    { 
    int value = new Foo().getBar()+1; 
    String script = String.valueOf(value); 
    Context context = Context.enter(); 
    ScriptableObject scriptableObject = context.initStandardObjects(); 
    ScriptableObject.putProperty(scriptableObject, "foo", new Foo()); 
    Object result = context.evaluateString(scriptableObject, script, "FooBar", 1, null); 
    Context.exit(); 
    System.out.println(result); 
    } 
    public static class Foo 
    { 
    public Integer getBar() 
    { 
    return 9; 
    } 
    } 
+0

Eğer bu kod sorunu nasıl çözdüğünü açıklayabilir misiniz? –

İlgili konular