GWT 의 JavaScriptObject 대상 의 베일 을 벗기다

GWT 의 JSNI 는 자바 코드 와 자바 script 코드 간 의 상호작용 기능 을 제공 하 는데 그 중에서 가장 중요 한 유형 은 바로 자바 script Object 이다.이것 은 매우 특수 한 종류 이다.
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);
	}

}
 
이렇게 하면 우리 의 포장 이 완성 된다.

좋은 웹페이지 즐겨찾기