是否有可能在执行的JavaScript代码中拦截Java对象的字段(和方法)访问?就像JSCocoa中允许处理属性和方法访问的委托一样。拦截犀牛中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建议的替代方案,也可以实现脚本接口来拦截对类的方法/字段的调用。
相关问题
- 1. 犀牛方法快门/拦截器
- 2. 访问犀牛的原生JSON.Stringify从Java
- 3. 犀牛对象浏览器
- 4. 的Java 8犀牛空白问题
- 5. 犀牛:在Javascript实现中访问Java接口变量
- 6. 犀牛嘲笑访问数据库
- 7. Java的犀牛 - 从javascrict
- 8. 犀牛:用数字
- 9. 拦截Windows对thumbcache.db文件的访问
- 10. 访问Java对象中的JavaScript对象的字段
- 11. 犀牛JS的eval比犀牛JS
- 12. 犀牛模拟,从非嘲笑对象
- 13. 犀牛
- 14. 在C++中拦截字段访问/修改
- 15. Unicode中的犀牛
- 16. 从java访问scala对象字段
- 17. 在JavaScript中拦截对象属性访问
- 18. 犀牛和envjs:与Java应用程序共享的JavaScript对象
- 19. java拦截器不拦截
- 20. 对象未设置为犀牛的对象的实例嘲笑
- 21. 问题链接到犀牛
- 22. 犀牛模拟问题
- 23. THREEjs Raycaster拦截对象问题
- 24. 访问在Spring拦截
- 25. 拦截JavaScript访问DOM
- 26. 拦截文件访问
- 27. Linq访问对象字段
- 28. Mozilla犀牛字符编码
- 29. ASM - 在外部进行拦截字段访问方法
- 30. 拦截私人字段访问做延迟加载
非常感谢,这正是我所寻找的。我很好奇,你在哪里找到关于该主题的信息? –