java 反射调用支付SDK
在android开发中会遇到各种SDK的接入,很是麻烦。最初在想能不能把所有的SDK都 融合到一个当中,发现有点异想天开。但是也可以解决SDK资源不小心没有引入,导致程序调用接口崩溃问题。经过查资料,还是写了一个小Demo,仅供参 考!很早之前写的了,估计移动基地SDK,有变动,不过道理是一样的。
仅以移动基地SDK举例。
1.移动支付需要的SO文件导入
public class CarrotApplication extends Application {
//是否含有移动支付SDK
boolean useCMBilling = false;
@Override
public void onCreate() {
// TODO Auto-generated method stub
try {
Class.forName("cn.cmgame.billing.api.GameInterface");
useCMBilling = true;
} catch (ClassNotFoundException ignored) { }
if(useCMBilling){
System.loadLibrary("megjb");
}
}
}
2.初始化移动基地支付
protected void init_cmcc(String app_name, String app_company,
String telphone_number) {
try {
Object [] cmcc_init_obj = {CarrotPaySDK.mContext,app_name,app_company,telphone_number};
Class<?> [] classparam = {Activity.class,String.class,String.class,String.class};
cfcaim.invokeStaticMethod("cn.cmgame.billing.api.GameInterface","initializeApp",cmcc_init_obj,classparam);
} catch (Exception e) {
// TODO: handle exception
Log.e("init_cmcc异常捕捉", "异常:"+e.toString());
}
}
3.上面 invokeStaticMethod 的实现
/**
* 执行某个类的静态方法
* @param className 类名
* @param methodName 方法名
* @param oArray 方法参数
* @param paramTypeArray 构造参数类型
* @author liudb
* */
public Object invokeStaticMethod(String className, String methodName,
Object[] oArray,Class<?> [] paramTypeArray) throws Exception {
Class<?> ownerClass = Class.forName(className);
Method method = ownerClass.getMethod(methodName, paramTypeArray);
return method.invoke(ownerClass, oArray);
}
4.调用支付接口
/**
* 执行移动支付
* @param isUsesim sim卡是否可用
* @param isRepeat 计费点是否可重复
* @param index 计费点编号
* @param order 订单号
* @param callback 支付回调
*/
protected void cmcc_pay(boolean isUsesim,boolean isRepeat,String index,String order,final CarrotPayCallBack callback){
try {
//这里的 callback 是自定义的回调函数,会在步骤7里介绍
cmcc_PayendHandler = new CarrotHandler(CarrotPaySDK.mContext){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
//这里处理返回结果
callback.onPayEnd(msg.what);
}
};
// 传入参数
Object [] cmcc_pay_param = {CarrotPaySDK.mContext,isUsesim,isRepeat,index,order,new Object()};
// 参数对应的TYPE
Class<?> [] cmcc_pay_paramtyp = {Context.class,boolean.class,boolean.class,String.class,String.class,Object.class};
// "IPayCallback" 是移动支付的回调函数名
cfcaim.invokeContainsInterfaceStaticMethod("cn.cmgame.billing.api.GameInterface", "doBilling", cmcc_pay_param,cmcc_pay_paramtyp,"IPayCallback",CarrotPaySdkFinal.CMCC_PAY);
} catch (Exception e) {
// TODO: handle exception
Log.e("cmcc_pay异常捕捉", "异常:"+e.toString());
}
}
5.重点就是上面 invokeContainsInterfaceStaticMethod 方法的实现
/**
* 执行包含接口的静态方法
* @param className 类名
* @param methodName 方法名
* @param oArray 具体参数
* @param paramTypeArray 构造参数类型
* @param interfaceName 接口名
* @author liudb
* */
public Object invokeContainsInterfaceStaticMethod(String className, String methodName,
Object[] oArray,Class<?> [] paramTypeArray,String interfaceName,CarrotPaySdkFinal payType) throws Exception {
Class<?> ownerClass = Class.forName(className); Class<?>[] argsClass = new Class[oArray.length];
Method [] ms = ownerClass.getDeclaredMethods();
for (int i = 0, j = oArray.length; i < j; i++) {
argsClass[i] = oArray[i].getClass();
}
Method method = findMethod(ms, methodName, paramTypeArray, interfaceName);
Class<?> clazz = Class.forName(othre_callBack.getName());
//因为接口的最后一个参数是回调函数,所以要设置监测回调
oArray[oArray.length -1] = Proxy.newProxyInstance(
clazz.getClassLoader(),
new Class[]{clazz},
new CarrotPayCallbackMethodInterceptor(payType));
othre_callBack = null;
return method.invoke(ownerClass, oArray);
}
6.还有如何捕获回调的接口返回的参数 CarrotPayCallbackMethodInterceptor 类的实现
public class CarrotPayCallbackMethodInterceptor implements InvocationHandler {
CarrotPaySdkFinal csf;
public CarrotPayCallbackMethodInterceptor (CarrotPaySdkFinal paytype){
csf = paytype;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
switch (csf) {
case CMCC_PAY:
//在这里获得回调函数返回的参数,通过自定义carrotSdkHelper发送给callback处理返回结果
for(int j = 0; j < args.length;j++){
if(args[j].getClass().getName().equalsIgnoreCase("java.lang.Integer")){
Integer result = (Integer)args[j];
switch (result) {
case 1:
Message msg_cmcc_success = new Message();
msg_cmcc_success.what = CarrotPaySDK.CARROT_PAY_SUCCESS;
CarrotPaySDK.carrotSdkHleper.cmcc_PayendHandler.sendMessage(msg_cmcc_success);
break;
case 2:
Message msg_cmcc_faild = new Message();
msg_cmcc_faild.what = CarrotPaySDK.CARROT_PAY_FAILD;
CarrotPaySDK.carrotSdkHleper.cmcc_PayendHandler.sendMessage(msg_cmcc_faild);
break;
default:
Message msg_cmcc_faild2 = new Message();
msg_cmcc_faild2.what = CarrotPaySDK.CARROT_PAY_FAILD;
CarrotPaySDK.carrotSdkHleper.cmcc_PayendHandler.sendMessage(msg_cmcc_faild2);
break;
}
}
}
break;
case OTHER_PAY:
Log.e("___________OTHER_______________", "____________________"+method.getName()); for(int j = 0; j < args.length;j++){
Log.e("___________OTHER_______________"+args[j].getClass().getName(), "____________________"+args[j].toString()); }
Log.e("___________OTHER_______________", "______333333______________");
break;
default:
break;
} return null;
} }
7.(1)callback 类的介绍
public interface CarrotPayCallBack {
public void onPayEnd(int isSuccess);
}
(2)具体实现新建一个CarrotPayCallBack,传到4步骤的方法里
new CarrotPayCallBack() { @Override
public void onPayEnd(int isSuccess) {
// TODO Auto-generated method stub
switch (isSuccess) {
case CarrotPaySDK.CARROT_PAY_SUCCESS:
Toast.makeText(getApplicationContext(), "支付成功", Toast.LENGTH_SHORT).show();
break;
case CarrotPaySDK.CARROT_PAY_CANCEL:
Toast.makeText(getApplicationContext(), "支付取消", Toast.LENGTH_SHORT).show();
break;
case CarrotPaySDK.CARROT_PAY_FAILD:
Toast.makeText(getApplicationContext(), "支付失败", Toast.LENGTH_SHORT).show();
break;
case CarrotPaySDK.CARROT_PAY_UNKNOW:
Toast.makeText(getApplicationContext(), "未知错误", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
8.代码已经提交到github,如有需要请移驾 https://github.com/liudb5/MyTestPay
9.已经在CSDN发过这个 http://blog.csdn.net/liudb5/article/details/49739873
java 反射调用支付SDK的更多相关文章
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- 通过Java反射调用方法
这是个测试用的例子,通过反射调用对象的方法. TestRef.java import java.lang.reflect.Method; import java.lang.reflect.In ...
- java反射调用dubbo接口
需求:项目增加幂等 场景:1.三个项目:a .b.c2.a项目加幂等3.b项目dubbo调用项目a的时候超时没有获取返回结果,增加重试机制(非立即重试,3min or 5min 后重试)4.c项目是一 ...
- Java 反射 调用私有构造方法
单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...
- java黑魔法-反射机制-02-通过Java反射调用其他类方法
package com.aaron.reflect; import java.lang.reflect.Method; import java.lang.reflect.InvocationTarge ...
- java反射调用api
cglib的fastmethod 简单示例: FastClass serviceFastClass = FastClass.create(Person.class); Person p = new P ...
- JAVA反射调用方法
1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotation.SetTable ...
- Java 反射调用的一种优化
写一些Java框架的时候,经常需要通过反射get或者set某个bean的field,比较普通的做法是获取field后调用java.lang.reflect.Field.get(Object),但每次都 ...
随机推荐
- 查看SQLServer各种缓存的情况
查看页面缓存: SELECT * FROM sys.dm_os_buffer_descriptors 清除页面缓存: CHECKPOINTDBCC DROPCLEANBUFFERS 查看执行计划缓存: ...
- DUILIB创建不规则窗体,自定义控件(很不错的几十篇文章)
http://blog.csdn.net/harvic880925/article/details/8925650 http://blog.csdn.net/harvic880925/article/ ...
- windows驱动开发推荐书籍
[作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...
- Android ToolBar详解
今年(2014) 的 google i/o 发表令多数人为之一亮的 material design,而 google 也从「google i/o 2014」 开始,大家也陆陆续续地看到其更新的 and ...
- HTTP, W3SVC, WAS 和 W3WP
IIS 请求主要模块 当客户端向 IIS 发出 HTTP 请求时,会有很多事情发生. 有许多内核模式和本机模式组件,用于将请求路由到最终响应请求的 W3WP 进程. 响应一个 ...
- 【HDOJ】1043 Eight
这道题目最开始做的时候wa+TLE.后面知道需要状态压缩,最近A掉.并且练习一下各种搜索算法. 1. 逆向BFS+康拓展开. #include <iostream> #include &l ...
- Unity 物体围绕圆周运动
用Unity开发游戏中,经常会有搜寻的功能,这时候我们需要一个放大镜的图标在那圆周运动.写了相关脚本直接挂载在要圆周运动的物体上即可: using UnityEngine; using System. ...
- cocos2d的安装
安装cocos2d其实就是在Xcode中安装几个模板,然后在Xcode里面就可以直接使用这些模板了. 其实说是模板,也就是封装了许许多多引擎的文件,相对于原生的程序,也许使用引擎模板更加方便. 下 ...
- 关于平移的 scrollTo和scrollBy的区别
这几天在项目中要求一部分布局实现整体偏移的效果 在网上查了下我使用来ScrollBy(x,y)方法 他的意思是将view实现整体偏移 而ScollTo(x,y)则是将原点偏移到相应指定的位置即 移 ...
- js冲突怎么解决
a.最容易出现的就是js的命名冲突①.变量名冲突变量有全局变量和局部变量当全局变量变量和局部变量名称一致时,就会js冲突,由于变量传递数值或地址不同就会产生JavaScript错误,甚至死循环.②.方 ...