実行されたJavaScriptコードでJavaオブジェクトのフィールド(およびメソッド)へのアクセスを傍受することはできますか? JSCocoaの代理人と同じように、プロパティとメソッドのアクセスを処理できます。RhinoのJavaオブジェクトのフィールドアクセスを傍受する
6
A
答えて
5
Context.setWrapFactoryを使用して、Javaオブジェクトをラップする方法を指定できます。
InterceptWrapFactory.java
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.WrapFactory;
public class InterceptWrapFactory extends WrapFactory{
@Override
public Scriptable wrapAsJavaObject(Context cx, Scriptable scope,
Object javaObject, Class<?> staticType) {
return new InterceptNativeObject(scope, javaObject, staticType);
}
}
InterceptNativeObject.java
JavaMethodWrapper.java
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.NativeJavaMethod;
import org.mozilla.javascript.Scriptable;
public class JavaMethodWrapper implements Function {
NativeJavaMethod method;
public JavaMethodWrapper(NativeJavaMethod method) {
this.method = method;
}
public boolean hasInstance(Scriptable instance) {
return method.hasInstance(instance);
}
public Object call(Context cx, Scriptable scope, Scriptable thisObj,
Object[] args) {
System.out.println("Call method: "+method);
return method.call(cx, scope, thisObj, args);
}
public boolean has(int index, Scriptable start) {
return method.has(index, start);
}
public Scriptable construct(Context cx, Scriptable scope, Object[] args) {
return method.construct(cx, scope, args);
}
public void put(int index, Scriptable start, Object value) {
method.put(index, start, value);
}
public void delete(int index) {
method.delete(index);
}
public Scriptable createObject(Context cx, Scriptable scope) {
return method.createObject(cx, scope);
}
public boolean has(String name, Scriptable start) {
return method.has(name, start);
}
public void defineConst(String name, Scriptable start) {
method.defineConst(name, start);
}
public void put(String name, Scriptable start, Object value) {
method.put(name, start, value);
}
public void delete(String name) {
method.delete(name);
}
public Scriptable getPrototype() {
return method.getPrototype();
}
public void setPrototype(Scriptable m) {
method.setPrototype(m);
}
public Scriptable getParentScope() {
return method.getParentScope();
}
public void setParentScope(Scriptable m) {
method.setParentScope(m);
}
public Object[] getIds() {
return method.getIds();
}
public Object get(int index, Scriptable start) {
return method.get(index, start);
}
public Object get(String name, Scriptable start) {
return method.get(name, start);
}
public String getClassName() {
return method.getClassName();
}
public Object getDefaultValue(Class<?> typeHint) {
return method.getDefaultValue(typeHint);
}
}
そして、これは次のとおりです。ここで は、フィールドアクセスとメソッド呼び出しを出力するラッパーを示しテストコード:
import java.util.Vector;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
public class InterceptTest {
public static void main(String[] args) {
Context cx=Context.enter();
cx.setWrapFactory(new InterceptWrapFactory());
Scriptable root=cx.initStandardObjects();
ScriptableObject.putProperty(root,"v", new Vector<String>());
cx.evaluateString(root, "v.add('foo'); v.get(0)", "src", 1, null);
}
}
0
hog1e3の代わりに、Scriptableインターフェイスを実装してクラスのメソッド/フィールドへの呼び出しを傍受することもできます。
関連する問題
- 1. RhinoのJavaオブジェクトへの呼び出しを傍受する機能のようなセキュリティマネージャを実装することは可能ですか?
- 2. ウィンドウを傍受するウィンドウを傍受する
- 3. WebViewの傍受
- 4. 傍受
- 5. 実行中のJavaプログラムの出力を傍受する
- 6. Javaインターフェイスメソッドの呼び出しを傍受する
- 7. Sitefinity、ページングイベントを傍受する
- 8. XHRを傍受する
- 9. 注射を傍受する
- 10. 他のアプリケーションのモーダルダイアログポップアップを傍受する
- 11. Javaスプリングセキュリティ - 別のログイン用のサブドメインURLを傍受しますか?
- 12. 受信メッセージの場所/受信メッセージを傍受する
- 13. 傍受ログメッセージslf4j
- 14. プロセスの実行を傍受する
- 15. QMailのSMTPメールを傍受する
- 16. UIPickerViewユーザーの選択を傍受する
- 17. アンドロイドのスクリーン更新を傍受する
- 18. プロパティの代入を傍受するInvalidCastException
- 19. WCFクライアントのメッセージを傍受する
- 20. コンボボックスのドロップダウンを傍受する
- 21. ストアキットのアラートビューを傍受する
- 22. MVCコントローラのアクションメソッドを傍受する
- 23. ウィンドウ内のマウスイベントを傍受する
- 24. JUnitのアサート機能を傍受する
- 25. Excelのオープンファイルを傍受する
- 26. ギャラリーの共有クリックを傍受する
- 27. ウェブブラウザのコンソールメッセージを傍受する
- 28. クロムエクステンションのHTTPリクエストボディを傍受する
- 29. レジストリの変更を傍受する
- 30. Javaクラスを使用してPHPメール()を傍受する
ありがとう、これは私が探していたものです。私は興味があります、あなたはトピックに関する情報をどこで見つけましたか? –