मूल रूप से मैं एक जावास्क्रिप्ट-जैसे सिंटैक्स को पार्स करने में सक्षम होना चाहता हूं। उदाहरण के लिए:

var results = system.function('example');  

if(results == "hello") {  
   console_print("ding dong.");  
}  

तो मूल रूप से आप इसे प्राप्त करते हैं, परिणाम "स्ट्रिंग" होंगे और system.function जावा विधि को कॉल करेंगे, और वे परिणाम परिणाम स्ट्रिंग में जाएंगे।

मैं इसमें बुनियादी गणित, और सत्यापन भी करने में सक्षम होना चाहता हूं, लेकिन मैं इसे जावा में करना चाहता हूं। कोई विचार?

2
Mark 27 अगस्त 2011, 14:21
यह मूर्खतापूर्ण लगेगा, लेकिन मैं एक जावास्क्रिप्ट फ़ाइल (file.js) को कॉल करना चाहता हूं और इससे फ़ंक्शन चलाना चाहता हूं।
 – 
Mark
27 अगस्त 2011, 15:49

2 जवाब

सबसे बढ़िया उत्तर

यदि आप जावास्क्रिप्ट का उपयोग करने के इच्छुक हैं (न केवल जावास्क्रिप्ट की तरह), और आप जावा 1.6+ का उपयोग कर रहे हैं, तो आप स्क्रिप्टिंग API:

import javax.script.*;

public class Main {

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

    String source =
        "var system = new Array();                       \n" +
        "system['foo'] = function(s) { return 'hello'; } \n" +
        "                                                \n" +
        "var results = system.foo('example');            \n" +
        "                                                \n" +
        "if(results == \"hello\") {                      \n" +
        "  print(\"ding dong.\");                        \n" +
        "}                                               \n";

    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
    engine.eval(source);
  }
}

जो प्रिंट करेगा:

ding dong.

कंसोल को।

और स्क्रिप्टिंग भाषा से जावा विधियों को लागू करने के लिए, आप BeanShell आज़मा सकते हैं:

package test;

import bsh.Interpreter;

public class Main {

  public static void foo(Object param) {
    System.out.println("From Java, param=" + param);
  }

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

    Interpreter i = new Interpreter();
    i.eval("a = 3 * 5; test.Main.foo(a);");
  }
}

जो प्रिंट करेगा:

From Java, param=15

बीनशेल का कोर इंटरप्रेटर जार केवल 143 KB है: इससे अधिक हल्का मुश्किल हो, आईएमओ।

1
Bart Kiers 27 अगस्त 2011, 16:05
@ कियर्स: आपने उस स्ट्रिंग को \n, " और + के साथ कैसे प्रारूपित किया? मैन्युअल रूप से या कोई शॉर्टकट?
 – 
Kowser
27 अगस्त 2011, 14:43
@Kowser, मैंने एक सादे पाठ संपादक का उपयोग करके जावास्क्रिप्ट स्निपेट बनाया और इसे जावास्क्रिप्ट दुभाषिया के माध्यम से चलाया। जब यह बिना किसी समस्या के चला, तो मैंने बस खाली स्ट्रिंग शाब्दिक के अंदर कोड चिपकाया: String source = ""; और IntelliJ ने सुनिश्चित किया कि उद्धरण ठीक से बच गए और मेरे लिए लाइन-ब्रेक जोड़ा गया।
 – 
Bart Kiers
27 अगस्त 2011, 14:46
यह वही नहीं है जो मैं चाहता था, मैं इसे जावा में कार्यों के लिए रूट करने में सक्षम होना चाहता हूं .. या आप ऐसा कर सकते हैं? यदि आप एक त्वरित उदाहरण दिखा सकते हैं जो शानदार होगा।
 – 
Mark
27 अगस्त 2011, 15:39
@ मार्क, आपने कहा: "और system.function एक फ़ंक्शन को कॉल करेगा,"। शायद आपको अपना प्रश्न संपादित करना चाहिए और इस अतिरिक्त जानकारी को जोड़ना चाहिए कि यह केवल एक फ़ंक्शन नहीं है जिसे आप कॉल करना चाहते हैं, बल्कि एक जावा विधि है।
 – 
Bart Kiers
27 अगस्त 2011, 15:39
यह बहुत अच्छा है, आखिरी सवाल। क्या आप "जेल" का कोई तरीका जानते हैं जैसा कि आप test.Main.foo क्लास से कह सकते हैं, इसलिए इसे test.security.Decrypt, या, test.security.Encrypt कहने के लिए फिर से नहीं लिखा जा सकता है?
 – 
Mark
27 अगस्त 2011, 19:11

मुझे लगता है कि आप इसके लिए राइनो का उपयोग कर सकते हैं। राइनो एक जावास्क्रिप्ट इंजन है जिसे जावा में एम्बेड किया जा सकता है।

1
Suraj Chandran 27 अगस्त 2011, 14:24
क्या इसका कोई हल्का संस्करण है?
 – 
Mark
27 अगस्त 2011, 15:31
@ मार्क, यह मेरे सुझाव जैसा ही है।
 – 
Bart Kiers
27 अगस्त 2011, 15:39