2016-10-03 10 views
0

私はこのlinkからメソッドを呼び出す方法を学ぶだけですが、今は使用しようとしていますが、必要なロジックでは機能しません。 私は単にスレッドからメソッドを呼び出すだけです。スレッド内でメソッドを呼び出す

私は以下のコードを使用しています。しかし、ここでの問題はループです ループはクラスからすべてのメソッドをリストし、特定のメソッドが存在するかどうかを確認してから呼び出す必要があります。

Class myclass = Class.forName("com.package.MainActivity"); 
Method[] methods = myclass.getMethods(); 
for (int i = 0; i < methods.length; i++) { 
    if (methods[i].getName().equals("methodName")) { 
     Log.w(TAG, "Method Found!"); 
     methods[i].invoke("methodName", "string data", 0123, 123, "string data"); 
    } 
} 

私は以下のコードで簡単にしたいですが、その方法が見つからないことを私に伝え続けます。

Class c=Class.forName("com.package.MainActivity"); 
Method m=c.getMethod("methodName"); 
Object t = c.newInstance(); 
Object o= m.invoke(t,"string data", 0123, 123, "string data"); 

ERROR: java.lang.NoSuchMethodException: methodName []は、私はまた、以下のコードを試してみましたが、それはまた、働いていないとエラーが言う:Can't create handler inside thread that has not called Looper.prepare()

Object carObj = Class.forName("com.package.MainActivity").newInstance(); 
Method method = carObj.getClass().getMethod("methodName"); 
method.invoke(method, "string data", 0123, 123, "string data"); 

私は以下に上記のすべてのコードをしています:

メインを方法を呼び出すべきクラス

public class MainActivity extends AppCompatActivity { 

    static MyHelper myHelper; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btnStart = (Button)findViewById(R.id.btnStart); 

     myHelper = new MyHelper(this); 
     myHelper.StartThread(); 

    } 

    /*The Method to Invoke*/ 
    public static void methodName(String data1, int var1, int var2, String data2){ 
     //some code here... 
    } 
} 
私は現在、invokeメソッドについてのストックと完全に混乱しています私の機能の一部

public class MyHelper{ 
    private Context context; 
    public MyHelper(Context context){ 
     this.context = context; 
    } 

    public static void StartThread(){ 
     TheThread theThread = new TheThread(context); 
     Thread t = new Thread(theThread); 
     t.start(); 
    } 

    //Some code below 
} 

方法は

public class TheThread implements Runnable{ 

    private Context context; 

    public TheThread(Context context){ 
     this.context = context; 
    } 

    @Override 
    public void run(){ 
     try{ 

      String className = context.getClass().getName(); //The Class Name including its package. 

      //First Attempt 
      /*Class myclass = Class.forName(className); 
      Method[] methods = myclass.getMethods(); 
      for (int i = 0; i < methods.length; i++) { 
       if (methods[i].getName().equals("methodName")) { 
        Log.w(TAG, "Method Found!"); 
        methods[i].invoke("methodName", "string data", 0123, 123, "string data"); 
       } 
      } */ 

      //Second Attempt 
      /*Class c=Class.forName(className); 
      Method m=c.getMethod("methodName"); 
      Object t = c.newInstance(); 
      Object o= m.invoke(t,"string data", 0123, 123, "string data");*/ 

      //Third attempt 
      /*Object carObj = Class.forName(className).newInstance(); 
      Method method = carObj.getClass().getMethod("methodName"); 
      method.invoke(method, "string data", 0123, 123, "string data"); */ 

     }catch(Exception e){ 
      Log.e("Invoke Error","Unable to invoke method => " + e.toString()); 
     } 
    } 
} 

を起動する必要があるスレッドを含むスレッドを起動するための

ヘルパークラス。これをどうすれば解決できますか?私は最初の試みを好むわけではありません。なぜなら、呼び出す前に特定のメソッドをチェックするためにクラスからすべてのメソッドをリストする必要があるからです。

答えて

0

あなたの2番目の例はほとんどの場合OKですが、メソッドにどのパラメータがあるかを伝える必要があります。 methodNameの+パラメータ型のリスト:

Class c=Class.forName("com.package.MainActivity"); 
Method m=c.getMethod("methodName", String.class, int.class, int.class, String.class); 
Object t = c.newInstance(); 
Object o= m.invoke(t,"string data", 0123, 123, "string data"); 

は、メソッドのシグネチャは、常にで構成されていることを覚えておいてください。パラメータ型を指定しないと、引数を持たないメソッドを探します。 NoSuchMethod例外が2つ目の例でスローされます。

あなたのメソッドが静的である場合(例のように)、クラスインスタンスを気にしないでください。 m.invoke呼び出しの最初のパラメータとしてnullを渡すことができます。メソッドjavadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#invoke-java.lang.Object-java.lang.Object...-を参照してください。

+0

こんにちは!私はとても近いです、あなたは本当に混乱する部分を修正します。私はこの部分のパラメータ 'm.invoke(t、" string data "、0123、123、" string data ");を初期化するだけでよいと考えました。とにかく、私はエラーが発生していることを知っています: 'Looper.prepare()'を呼び出さなかったスレッドの中でハンドラを作成することはできませんが、すでに修正しました。将来の研究者にとっては、そのエラーを解決するコードを追加してください。私は他の人々がここに私が持っているコードを助けたいと思っています 'Activity activity =(Activity)context; アクティビティrunOnUiThread(新しいRunnableを(){ \t @Override \tます。public void実行(){ \t \t //メソッドを呼び出す \t}} ' – lopi

+0

はありがとうございました!!! – lopi

関連する問題