phonegap插件编写升级

本文介绍了一个使用PhoneGap开发插件的例子,并通过Java注解简化了方法调用流程。具体展示了如何利用自定义注解进行反射,实现插件方法的动态调用。

     个人博客原文链接http://www.zeromike.net/?p=64

     上一篇:写一个phonegap插件 中的例子已经可以作为开发时的一个参考,但是我们要使用注解的方式简化if/else调用方法,注解方式,请参考我的这篇 java注解方式进行反射

     1.MyPlugin的代码

     

package com.mike;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;

public class MyPlugin extends CordovaPlugin {
	// 方法map
	private static final Map<String, Method> METHOD_MAP = new HashMap<String, Method>();
	// 加载类
	private static final List<Class<?>> LOADED_CLASS = new LinkedList<Class<?>>();

	public MyPlugin()
	{
		if (!LOADED_CLASS.contains(getClass()))
		{
			for (Method method : getClass().getDeclaredMethods())
			{
				MyAnnontion anno = method.getAnnotation(MyAnnontion.class);
				if (anno != null)
				{
					METHOD_MAP.put(method.getName(), method);
				}
			}
			LOADED_CLASS.add(getClass());
		}
	}
	@Override
	public boolean execute(String action, JSONArray args,
			CallbackContext callbackContext) throws JSONException {
		Method mth = METHOD_MAP.get(action);
		if (mth != null)
		{
			try {
				mth.invoke(this, args, callbackContext);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return true;
		}
		return false;
	}

	@MyAnnontion
	private void echo(JSONArray args, CallbackContext callbackContext) throws JSONException {
		String message = args.getString(0);
		if (message != null && message.length() > 0) {
			callbackContext.success(message);
		} else {
			callbackContext.error("Expected one non-empty string argument.");
		}
	}
}

   MyPlugin的构造函数在每次调用插件方法时进行调用,初始化数据。

   2.MyAnnontion

   

package com.mike;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)//表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时
@Target(ElementType.METHOD)//说明该注解只能被声明在一个类的方法前
public @interface MyAnnontion {

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值