0

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)

次に何を試すかわかりません...どんな助けでも大歓迎です。

4

2 に答える 2

1

呼び出そうとしているメソッドが

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

お役に立てれば!!!

于 2012-08-06T17:13:07.713 に答える
0

問題は、メソッドの呼び出しではなく、メソッドを取得するための呼び出しです。
Class []はActivity.classで初期化されるため、署名
void initialize(Activity activity、String string)を持つメソッドが検索されます。

このメソッドは存在しません。
だからそれは

 paramInitialize[0] = Context.class; 

方法を見つけるために

initialize(Contex ctxt, String arg).
于 2014-01-14T08:51:18.710 に答える