我正在尝试使用反射而不是包含jar文件。当我不使用jar代码时,我想这样做以减少我的apk大小...但如果我包含代码,我必须包括jar。话虽如此,我试图抓住反思而不是做得好。
我有这个代码来查看可用的方法(并且它可以工作):
//initialize method params
Class[] paramInitialize = new Class[2];
paramInitialize[0] = Activity.class;
paramInitialize[1] = String.class;
try {
Logger.i(DEBUG_TAG, "try statement");
Class <?> tremorVideoCls = Class.forName("com.tremorvideo.sdk.android.videoad.TremorVideo");
Class <?> tremorSettingsCls = Class.forName("com.tremorvideo.sdk.android.videoad.Settings");
Object object = tremorVideoCls.newInstance();
String apkName = this.getPackageManager().getApplicationInfo(this.getPackageName(), 0).sourceDir;
loader = new dalvik.system.PathClassLoader(apkName, ClassLoader.getSystemClassLoader());
tremorVideoCls = loader.loadClass("com.tremorvideo.sdk.android.videoad.TremorVideo");
Method m[] = tremorVideoCls.getMethods();
Method declaredM[] = tremorVideoCls.getDeclaredMethods();
for (int i = 0; i < m.length; i++) {
Logger.i(DEBUG_TAG, "getMethods is " + m[i].toString());
}
Field []field = tremorSettingsCls.getFields();
for (int i = 0; i < field.length; i++) {
Logger.i(DEBUG_TAG, "getFields is " + field[i].toString());
}
Method tremorInitialize = tremorVideoCls.getMethod("initialize", paramInitialize);
Logger.i(DEBUG_TAG, "tremorInitialize is " + tremorInitialize.toGenericString());
// tremorInitialize.invoke(object, this, ACCUWX.TREMOR_ADSPACE_TEST);
} catch (ClassNotFoundException e) {
} catch (NoSuchMethodException x) {
...
但是,我得到了一个抛出异常的logcat错误:
08-06 11:48:51.134: W/System.err(11688): java.lang.NoSuchMethodException: initialize [class android.app.Activity, class java.lang.String]
这是logcat打印出来的方法:
08-06 11:48:51.118: I/Flagship/MainActivity(11688): getMethods is public static void com.tremorvideo.sdk.android.videoad.TremorVideo.initialize(android.content.Context,java.lang.String)
我不确定接下来会尝试什么......任何帮助都非常感激。
答案 0 :(得分:1)
如果您尝试调用的方法是
public static void com.tremorvideo.sdk.android.videoad.TremorVideo.initialize(android.content.Context,java.lang.String)
,错误是
08-06 11:48:51.134: W/System.err(11688): java.lang.NoSuchMethodException: initialize [class android.app.Activity, class java.lang.String]
它清楚地表明该方法需要android.content.Context
,但您传递的是android.app.Activity
在通话中
tremorInitialize.invoke(object, this, ACCUWX.TREMOR_ADSPACE_TEST);
而不是传递this
,您应该传递android.content.Context
的实例。
希望这有帮助!!!
答案 1 :(得分:0)
问题不在于调用方法,而在于调用方法
因为Class []是用Activity.class初始化的,所以带有签名的方法为
搜索void initialize(活动活动,字符串字符串)。
此方法不存在。
所以它应该是
paramInitialize[0] = Context.class;
找到方法
initialize(Contex ctxt, String arg).