2016-01-26 136 views
-1

我有兩個類。我想調用QuestionPicker.class中的「saveq」方法。此方法將一些字符串保存到SharedPreferences中。我想從另一個類調用該方法,即稱爲Questions。 我想調用使用反射的方法,但我的代碼不起作用。 我認爲這個問題是在反思的地方,但我看不到它。 有人可以看到問題嗎?由於使用反射的調用方法

這裏是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

我簡化了一些類。我需要通過不同的變量名稱來調用幾個方法,這些方法來自Questions.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(); 
     } 
    } 
}