1

リフレクションを使用してMainActivityクラスのプライベート属性を使用しようとしていますが、何が間違っているのかわかりません。誰かが助けてくれませんか。これが私のコードです:MainActivityクラスそしてこれは私が例外から得ているエラーです:java.lang.IllegalArgumentException:オブジェクトはクラスのインスタンスではありません

public class MainActivity extends Activity {
/** Called when the activity is first created. */

private  Controller scheduleFor = new Controller();
private TextView display ;
private TextView title ;
   OnClickListener monListener = new OnClickListener(){

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub      
        scheduleFor.handleRequest("monday");}};
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    display = (TextView)findViewById(R.id.scheduleView);
    title = (TextView)findViewById(R.id.day);

    ImageButton monButton = (ImageButton)findViewById(R.id.monbutton);
            monButton.setOnClickListener(monListener);
}

public void onStart(){
    super.onStart();
    display.setText("");
    title.setText("Get your schedule");
}
}



public class MonHandler implements Handler {

private static final String TAG = "Scheduler";

@Override
public void handleIt(Object... args){
    // TODO Auto-generated method stub

    try{                                                             
        Class<?> mainActivityClass =  Class.forName("freesoft.nex.ec.MainActivity");


        Field fDisplay = mainActivityClass.getDeclaredField("display");
        Field fTitle = mainActivityClass.getDeclaredField("title");

        fDisplay.setAccessible(true);
        fTitle.setAccessible(true);

        TextView dSchedule = (TextView) fDisplay.get(mainActivityClass);
        TextView dTitle    = (TextView)fTitle.get(mainActivityClass);

        String schedule =   
                " 07h00  Breakfast\n" +
                        " 08h00  Department Metting\n" +
                        " 09h00  Class CIT 310\n"   +       
                        " 10h015 Class CIT 356\n"   +       
                        " 11h30  Class CIT 499\n"   +       
                        " 12h45  Lunch\n"   +       
                        " 14h00  Labs\n"    +
                        " 17h00  Back home\n" +
                        " 21h00  F.H.E - ??\n";

        String sDay = "Monday";


        dSchedule.setText(schedule);
        dTitle.setText("Schedule for " + sDay); 

    }catch (ClassNotFoundException e) {
        e.printStackTrace();        
        Log.d(TAG, "-->" + e);
    }catch(NoSuchFieldException x){
        x.printStackTrace();
        Log.d(TAG, "-->" + x);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.d(TAG, "--> " + e.getMessage());
        Log.d(TAG, "--> " + e.getCause());
        Log.d(TAG, "-->" + e.getLocalizedMessage());
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.d(TAG, "-->" + e);
    }

}
}
4

1 に答える 1

1

問題は、クラスでの.get(...)メソッドの使用法を誤解しているようです。Field

TextView dSchedule = (TextView) fDisplay.get(mainActivityClass);
TextView dTitle    = (TextView) fTitle.get(mainActivityClass);

クラスへの参照を渡していますが、ドキュメントと表示されている例外に従って、そのタイプの実行中のインスタンス/オブジェクトを提供する必要があります。したがって、あなたが本当に求めているのは、 のオブジェクトを渡すことですfreesoft.nex.ec.MainActivityMainActivityこれがコードが存在するクラスと実際に同一であると仮定すると、上記のステートメントを次のように変更するだけで済みます。

TextView dSchedule = (TextView) fDisplay.get(MainActivity.this);
TextView dTitle    = (TextView) fTitle.get(MainActivity.this);

内部クラスthisのインスタンスを参照するため、単に指定することはできないことに注意してください。MonHandler

于 2012-06-28T01:16:00.717 に答える