简体   繁体   English

使用Java反射从MainActivity类访问私有属性-字段

[英]Accessing private attributes from MainActivity class using java reflection - Field

I am trying to use reflection to use a private attribute from MainActivity Class, but I do not know what I am doing wrong. 我正在尝试使用反射来使用MainActivity类的私有属性,但是我不知道自己在做什么错。 Could someone give a help. 有人可以帮忙吗? Here is my code : MainActivity class and This is the error I am getting from the exception : java.lang.IllegalArgumentException: object is not an instance of the class 这是我的代码:MainActivity类,这是我从异常中得到的错误:java.lang.IllegalArgumentException:object不是该类的实例

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);
    }

}
}

The problem appears to be that you misunderstood the usage of the .get(...) method in the Field class. 问题似乎是您误解了Field类中.get(...)方法的用法。

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

You are passing in a reference to a class, but rather, you should be supplying an running instance/object of that type, as per the documentation and the exception you're seeing. 您传递的是对类的引用,但是,应该根据文档和所看到的异常,提供该类型的正在运行的实例/对象。 So, what you're really after is passing in an object of freesoft.nex.ec.MainActivity . 因此,您真正要做的就是传递一个freesoft.nex.ec.MainActivity对象。 Now, assuming that is actually identical to the MainActivity class in which your code resides, all you probably need to do is change above statements to: 现在,假设它实际上与代码所在的MainActivity类相同,那么您可能要做的就是将上述语句更改为:

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

Note that you cannot just supply this , since that will refer to the instance of the MonHandler inner class. 请注意,您不能仅提供this ,因为它将引用MonHandler内部类的实例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM