揭开GWT的JavaScriptObject对象的神秘面纱

2024-05-14 10:38

本文主要是介绍揭开GWT的JavaScriptObject对象的神秘面纱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GWT的JSNI提供了java代码和javascript代码之间的交互功能,其中最重要的一个类就是 JavaScriptObject 。这是一个非常特殊的类:

1.不可以直接new创建,必须通过JSNI的native方法来创建。这也是为什么它只有protected修饰符的构造函数的原因了。

2.java代码可以把JavaScriptObject的对象通过native再次传回给js使用。

3.从JavaScriptObject类继承的类其构造函数的修饰符必须是protected,其公共方法必须加上final修饰符。


先一个应用的小例子,希望对朋友们理解代码有所帮助。

 

现假设我们有一个外联的javascript文件中有这么一个类

function Person() {}Person.prototype.setName = function(name) {this.name = name;
}

我们就可以在java中构建一个JSPerson类对javascript的Person类进行封装

public class JSPerson extends JavaScriptObjectWrapper {protected JSPerson() {}public static native JSPerson createNew() /*-{return new $wnd.Person();}-*/;
}

然后使用这个类


JSPerson jsPerson = JSPerson.createNew();
jsPerson.invokeMethod("setName", "sbw");

有了这样一个JSNI得通用类后,和外联js交互起来竟然如此的简单。


下面详细的解说,我们开始对JavaScriptObject类进行继承和封装,实现对外联的javascript库的方便操作。


1.首先我们建立类JavaScriptObjectWrapper继承自JavaScriptObject

package com.sbw.client.common;import com.google.gwt.core.client.JavaScriptObject;public class JavaScriptObjectWrapper extends JavaScriptObject {protected JavaScriptObjectWrapper() {}}

2.然后我们建立JSArrayHelper类,实现将java的Object数组转换为javascript的数组。这里请注意数组中每一个元素的类型的转换。


package com.sbw.client.common;public class JSArrayHelper {/**** @param objs : must be primitive type or JavaScriptObject, now just support few you can extend* @return*/public static JavaScriptObjectWrapper toJSArray(Object... objs) {JavaScriptObjectWrapper jsArray = createJSArray();for(int i = 0; i < objs.length; i++) {setJSArray(jsArray, i, objs[i]);}return jsArray;}private static native JavaScriptObjectWrapper createJSArray() /*-{return [];}-*/;private static void setJSArray(JavaScriptObjectWrapper jsArray, int index, Object value) {if(value.getClass().equals(java.lang.Integer.class)) {setJSArray(jsArray, index, (int) Integer.valueOf(value.toString()));}if(value.getClass().equals(java.lang.Float.class)) {setJSArray(jsArray, index, (float) Float.valueOf(value.toString()));}if(value.getClass().equals(java.lang.Double.class)) {setJSArray(jsArray, index, (double) Double.valueOf(value.toString()));}if(value.getClass().equals(java.lang.Boolean.class)) {setJSArray(jsArray, index, (boolean) Boolean.valueOf(value.toString()));}if(value.getClass().equals(java.lang.String.class)) {setJSArray(jsArray, index, value.toString());}if(value.getClass().equals(JavaScriptObjectWrapper.class)) {setJSArray(jsArray, index, (JavaScriptObjectWrapper) value);}}private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, int value) /*-{jsArray[index] = value;}-*/;private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, float value) /*-{jsArray[index] = value;}-*/;private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, double value) /*-{jsArray[index] = value;}-*/;private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, boolean value) /*-{jsArray[index] = value;}-*/;private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, String value) /*-{jsArray[index] = value;}-*/;private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, JavaScriptObjectWrapper value) /*-{jsArray[index] = value;}-*/;
}


3.创建JavaScriptObjectWrapperImpl类,全是static native方法,实现类似于java反射的机制,可以调用方法,可以获取和设置属性


package com.sbw.client.common;public class JavaScriptObjectWrapperImpl {public static native JavaScriptObjectWrapper invokeJSMethod(JavaScriptObjectWrapper jsObject, String methodName, JavaScriptObjectWrapper arguments) /*-{return jsObject[methodName].apply(jsObject, arguments);}-*/;public static native void setProperty(JavaScriptObjectWrapper object, String name, int value) /*-{object[name] = value;}-*/;public static native int getPropertyAsInt(JavaScriptObjectWrapper object, String name) /*-{var ret = object[name];return (ret === undefined) ? 0 : ret;}-*/;public static native void setProperty(JavaScriptObjectWrapper object, String name, String value) /*-{object[name] = value;}-*/;public static native String getPropertyAsString(JavaScriptObjectWrapper object, String name) /*-{var ret = object[name];return (ret === undefined) ? null : ret;}-*/;public static native void setProperty(JavaScriptObjectWrapper object, String name, boolean value) /*-{object[name] = value;}-*/;public static native boolean getPropertyAsBoolean(JavaScriptObjectWrapper object, String name) /*-{var ret = object[name];return (ret === undefined) ? 0 : ret;}-*/;public static native void setProperty(JavaScriptObjectWrapper object, String name, float value) /*-{object[name] = value;}-*/;public static native float getPropertyAsFloat(JavaScriptObjectWrapper object, String name) /*-{var ret = object[name];return (ret === undefined) ? 0 : ret;}-*/;public static native void setProperty(JavaScriptObjectWrapper object, String name, double value) /*-{object[name] = value;}-*/;public static native double getPropertyAsDouble(JavaScriptObjectWrapper object, String name) /*-{var ret = object[name];return (ret === undefined) ? 0 : ret;}-*/;public static native void setProperty(JavaScriptObjectWrapper object, String name, JavaScriptObjectWrapper value) /*-{object[name] = value;}-*/;public static native JavaScriptObjectWrapper getProperty(JavaScriptObjectWrapper object, String name) /*-{var ret = object[name];return (ret === undefined) ? null : ret;}-*/;
}


4.在其它两个类的支持下完善JavaScriptObjectWrapper类

package com.sbw.client.common;import com.google.gwt.core.client.JavaScriptObject;public class JavaScriptObjectWrapper extends JavaScriptObject {protected JavaScriptObjectWrapper() {}public final JavaScriptObjectWrapper invokeJSMethod(String methodName, Object... objs) {JavaScriptObjectWrapper arguments = JSArrayHelper.toJSArray(objs);return JavaScriptObjectWrapperImpl.invokeJSMethod(this, methodName, arguments);}public final void setProperty(String name, int value){JavaScriptObjectWrapperImpl.setProperty(this, name, value);}public final int getPropertyAsInt(String name){return JavaScriptObjectWrapperImpl.getPropertyAsInt(this, name);}public final void setProperty(String name, String value){JavaScriptObjectWrapperImpl.setProperty(this, name, value);}public final String getPropertyAsString(String name){return JavaScriptObjectWrapperImpl.getPropertyAsString(this, name);}public final void setProperty(String name, boolean value){JavaScriptObjectWrapperImpl.setProperty(this, name, value);}public final boolean getPropertyAsBoolean(String name){return JavaScriptObjectWrapperImpl.getPropertyAsBoolean(this, name);}public final void setProperty(String name, float value){JavaScriptObjectWrapperImpl.setProperty(this, name, value);}public final float getPropertyAsFloat(String name){return JavaScriptObjectWrapperImpl.getPropertyAsFloat(this, name);}public final void setProperty(String name, double value){JavaScriptObjectWrapperImpl.setProperty(this, name, value);}public final double getPropertyAsDouble(String name){return JavaScriptObjectWrapperImpl.getPropertyAsDouble(this, name);}public final void setProperty(String name, JavaScriptObjectWrapper value){JavaScriptObjectWrapperImpl.setProperty(this, name, value);}public final JavaScriptObjectWrapper getProperty(String name){return JavaScriptObjectWrapperImpl.getProperty(this, name);}}

这样我们的封装就完成了。

这篇关于揭开GWT的JavaScriptObject对象的神秘面纱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988516

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor