1

Jsoup を使用して、HTML ファイルの JavaScript 部分を抽出します。それをJava String Objectとして保存します。

javax.script.ScriptEngineを使用して js の関数内の関数リスト、変数リストを抽出したい

JavaScript 部分にはいくつかの関数セクションがあります。

元)

function a() {
var a_1;
var a_2
...
}

function b() {
    var b_1;
    var b_2;
...
}

function c() {
    var c_1;
    var c_2;
...
}

私の目標はすぐ下にあります。

リスト関数リスト

a b c

リスト varListA

a_1 a_2 ...

リスト varListB

b_1 b_2 ...

リスト varListC

c_1 c_2 ...

関数リストと変数リスト(または値)を抽出するにはどうすればよいですか?

4

3 に答える 3

1

エンジンに JavaScript をロードした後、JavaScript のイントロスペクションを使用してこれを行うことができると思います。たとえば、関数の場合:

ScriptEngine engine;
// create the engine and have it load your javascript
Bindings bind = engine.getBindings(ScriptContext.ENGINE_SCOPE);
Set<String> allAttributes = bind.keySet();
Set<String> allFunctions = new HashSet<String>();
for ( String attr : allAttributes ) {
    if ( "function".equals( engine.eval("typeof " + attr) ) ) {
        allFunctions.add(attr);
    }
}
System.out.println(allFunctions);

javascript スクリプト エンジンの内部機構 (したがって、安全に使用できない) を掘り下げることなく、関数内の変数 (ローカル変数) を抽出する方法を見つけられませんでした。

于 2013-03-21T14:05:24.077 に答える
0

それはかなりトリッキーです。ScriptEngineAPI はコードの検査には適していないようです。instance ofだから、私はandcast演算子を使ったかなり醜い解決策を持っています。

       Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
       for (Map.Entry<String, Object> scopeEntry : bindings.entrySet()) {
           Object value = scopeEntry.getValue();
           String name = scopeEntry.getKey();
           if (value instanceof NativeFunction) {
               log.info("Function -> " + name);
               NativeFunction function = NativeFunction.class.cast(value);
               DebuggableScript debuggableFunction = function.getDebuggableView();
               for (int i = 0; i < debuggableFunction.getParamAndVarCount(); i++) {
                   log.info("First level arg: " + debuggableFunction.getParamOrVarName(i));
               }
           } else if (value instanceof Undefined
                   || value instanceof String
                   || value instanceof Number) {
               log.info("Global arg -> " + name);
           }
       }
于 2013-03-21T15:00:17.307 に答える