GWT 의 JavaScriptObject 대상 의 베일 을 벗기다
9690 단어 JavaScriptGoogleprototypegwt
1. new 를 직접 만 들 수 없습니다. JSNI 의 native 방법 으로 만들어 야 합 니 다.이것 도 왜 그것 이 protected 수정자 의 구조 함수 만 있 는 이유 이다.
2. 자바 코드 는 자바 스 크 립 트 Object 의 대상 을 native 를 통 해 js 에 다시 전송 하여 사용 할 수 있 습 니 다.
3. JavaScriptObject 류 에서 계승 하 는 구조 함수 의 수식 자 는 proctected 이 어야 하 며, 공공 방법 은 final 수식 자 를 추가 해 야 합 니 다.
먼저 애플 리 케 이 션 의 작은 예 를 들 어 코드 를 이해 하 는 데 도움 이 되 기 를 바 랍 니 다.
현재 우리 가 외부 연 결 된 자바 script 파일 에 이런 종류 가 있다 고 가정 합 니 다.
function Person() {
}
Person.prototype.setName = function(name) {
this.name = name;
}
자바 에 JSperson 클래스 를 구축 하여 자바 script 의 Person 클래스 를 패키지 할 수 있 습 니 다.
public class JSPerson extends JavaScriptObjectWrapper {
protected JSPerson() {
}
public static native JSPerson createNew() /*-{
return new $wnd.Person();
}-*/;
}
그리고 이 걸 로.
JSPerson jsPerson = JSPerson.createNew();
jsPerson.invokeMethod("setName", "yingxia");
이런 JSNI 가 유 니 버 설 클래스 를 얻 은 후에 외연 js 와 상호작용 하 는 것 이 이렇게 간단 하 다 니.
다음은 자 바스 크 립 트 Object 류 를 계승 하고 봉인 하여 외부 연 결 된 자 바스 크 립 트 라 이브 러 리 에 대한 편리 한 조작 을 실현 하 는 상세 한 설명 입 니 다.
1. 우선 클래스 JavaScriptObject Wrapper 를 만들어 JavaScriptObject 로부터 계승 합 니 다.
package com.yingxia.tonglin.client.common;
import com.google.gwt.core.client.JavaScriptObject;
public class JavaScriptObjectWrapper extends JavaScriptObject {
protected JavaScriptObjectWrapper() {
}
}
2. 그리고 JSarray Helper 류 를 만들어 자바 의 Object 배열 을 자바 script 의 배열 로 변환 합 니 다.배열 의 모든 요소 의 유형 전환 에 주의 하 십시오.
package com.yingxia.tonglin.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. JavaScriptObject WrapperImpl 류 를 만 듭 니 다. 모두 static native 방법 으로 자바 반사 와 유사 한 체 제 를 실현 하고 방법 을 호출 하여 속성 을 가 져 오고 설정 할 수 있 습 니 다.
package com.yingxia.tonglin.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. 다른 두 가지 유형의 지원 하에 자 바스 크 립 트 Object Wrapper 클래스 를 보완 합 니 다.
package com.yingxia.tonglin.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);
}
}
이렇게 하면 우리 의 포장 이 완성 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.