揭开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

相关文章

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ