首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过反射Java使用方法

如何通过反射Java使用方法
EN

Stack Overflow用户
提问于 2012-08-06 23:56:30
回答 2查看 1.2K关注 0票数 0

我正在尝试使用反射而不是包含jar文件。当我不使用jar code...but时,我想这样做以减少我的apk大小。如果我包括代码,我必须包括jar。这就是说,我正在努力掌握反射,但做得并不好。

我有以下代码来查看可用的方法(并且它是有效的):

代码语言:javascript
运行
复制
//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错误:

代码语言:javascript
运行
复制
08-06 11:48:51.134: W/System.err(11688): java.lang.NoSuchMethodException: initialize [class android.app.Activity, class java.lang.String]

下面是输出该方法的logcat:

代码语言:javascript
运行
复制
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)

我不知道做什么尝试next...any帮助非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-07 01:13:08

如果您尝试调用的方法是

代码语言:javascript
运行
复制
public static void com.tremorvideo.sdk.android.videoad.TremorVideo.initialize(android.content.Conte‌​xt,java.lang.String)

错误是

代码语言:javascript
运行
复制
08-06 11:48:51.134: W/System.err(11688): java.lang.NoSuchMethodException: initialize [class android.app.Activity, class java.lang.String]

它清楚地表明该方法需要android.content.Conte‌​xt,而您传递的是android.app.Activity

在呼叫中

代码语言:javascript
运行
复制
tremorInitialize.invoke(object, this, ACCUWX.TREMOR_ADSPACE_TEST);

您应该传递android.content.Conte‌​xt的一个实例,而不是传递this

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2014-01-14 16:51:19

问题不在于调用方法,而在于调用检索方法。

因为Class[]是用Activity.class初始化的,所以带有签名的方法

代码语言:javascript
运行
复制
   void initialize(Activity activity, String string) is searched for.

此方法不存在。

所以它应该是

代码语言:javascript
运行
复制
 paramInitialize[0] = Context.class; 

找到方法

代码语言:javascript
运行
复制
initialize(Contex ctxt, String arg).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11831765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档