2016-01-26 3 views
-1

У меня есть два класса. Я хочу вызвать метод saveq в QuestionPicker.class. Этот метод сохраняет некоторые строки в SharedPreferences. Я хочу вызвать этот метод из другого класса, который называется «Вопросы». Я хочу вызвать метод с использованием отражения, но мой код не работает. Я думаю, что проблема где-то при отражении, но я не вижу этого. Может ли кто-нибудь увидеть проблему? БлагодаряInvoke Method using Reflection

Вот QuestionPicker.class

public class QuestionPicker { 

    public void saveq() { 

     // MyApplication Class calls Context 
     Context context = MyApplication.getAppContext(); 

     // Values to save 
     String Q1 = "SomeQuestion"; 
     String Q2 = "SomeOtherQuestion"; 
     String Q3 = "AndEvenMoreQuestions"; 

     // Save the Strings to SharedPreferences 
     SharedPreferences.Editor editor = context.getSharedPreferences("QuestionsSaver", 0).edit(); 

     editor.putString("Q1", Q1); 
     editor.putString("Q2", Q2); 
     editor.putString("Q3", Q3); 

     editor.apply(); 

    } 
} 

А вот Questions.class

public class Questions extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_questions); 

     // storing string resources into Array 
     String[] subjects = getResources().getStringArray(R.array.subjects); 
     ListView lv = (ListView) findViewById(R.id.listView); 
     // Binding resources Array to ListAdapter 
     ListAdapter adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.label, subjects); 
     lv.setAdapter(adapter); 


     // listening to single list item on click 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 

      // Invoke the saving Method 
       try { 
        Class cls = Class.forName("com.test.QuestionPicker"); 
        Object obj = cls.newInstance(); 
        Method method = cls.getMethod("saveq"); 
        method.invoke(obj); 

       } catch(Exception ex){ 
        ex.printStackTrace(); 
       } 



      } 
     }); 
    } 
} 
+0

Метод "saveq" является публичным, в чем причина, чтобы использовать отражение? –

+0

Я немного упростил классы. Мне нужно вызвать несколько методов с помощью разных имен переменных из Вопросов.class –

+3

Что означает «не работает»? – Joni

ответ

0

Я согласен с @Joni - что не работает? Например, код ниже, «работает». Я удалил Androidness, но концепция должна быть одинаковой.

package com.company; 

public class QuestionPicker { 
    public void saveq() { 
     System.out.println("saveq is called"); 
    } 
} 

и

package com.company; 

import java.lang.reflect.Method; 

public class Main { 

public static void main(String[] args) { 
     try { 
      Class clazz = Class.forName("com.company.QuestionPicker"); 
      Object obj = clazz.newInstance(); 
      Method method = clazz.getMethod("saveq"); 
      method.invoke(obj); 
     } catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 
}