如何通过反射Java使用方法



我正在尝试使用反射,而不是包含一个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)

我不知道下一步该怎么做。。。非常感谢任何帮助。

如果您试图调用的方法是

public static void com.tremorvideo.sdk.android.videoad.TremorVideo.initialize(android.content.Conte‌​xt,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.Conte‌​xt,但您通过的是android.app.Activity

在呼叫中

tremorInitialize.invoke(object, this, ACCUWX.TREMOR_ADSPACE_TEST);

与其传递this,不如传递android.content.Conte‌​xt的实例。

希望这能有所帮助!!!

问题不在于方法的调用,而在于检索方法的调用
因为Class[]是用Activity.Class初始化的,Activity.Class是一个签名为
的方法搜索void initialize(活动活动,字符串)

此方法不存在
所以应该是

 paramInitialize[0] = Context.class; 

查找方法

initialize(Contex ctxt, String arg).

最新更新