Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java反射从MainActivity类访问私有属性-字段_Java_Android - Fatal编程技术网

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

使用java反射从MainActivity类访问私有属性-字段,java,android,Java,Android,我试图使用反射来使用MainActivity类的私有属性,但我不知道我做错了什么。有人能帮忙吗。这是我的代码:MainActivity类和 这是我从异常中得到的错误: java.lang.IllegalArgumentException:对象不是该类的实例 public class MainActivity extends Activity { /** Called when the activity is first created. */ private Controller sched

我试图使用反射来使用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);
    }

}
}
公共类MainActivity扩展活动{
/**在首次创建活动时调用*/
专用控制器scheduleFor=新控制器();
私有文本视图显示;
私有文本视图标题;
OnClickListener monListener=新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
HandlerRequest(“星期一”);};
@凌驾
创建时的公共void(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(“获取您的日程安排”);
}
}
公共类MonHandler实现处理程序{
私有静态最终字符串TAG=“Scheduler”;
@凌驾
公共无效句柄(对象…参数){
//TODO自动生成的方法存根
试试{
类mainActivityClass=Class.forName(“freesoft.nex.ec.MainActivity”);
字段fDisplay=mainActivityClass.getDeclaredField(“显示”);
字段fTitle=mainActivityClass.getDeclaredField(“标题”);
fDisplay.setAccessible(true);
fTitle.setAccessible(true);
TextView dSchedule=(TextView)fDisplay.get(mainActivityClass);
TextView dTitle=(TextView)fTitle.get(mainActivityClass);
字符串计划=
“07h00早餐\n”+
“08h00部门会议\n”+
“09h00类CIT 310\n”+
“10h015类CIT 356\n”+
“11h30类CIT 499\n”+
“12h45午餐\n”+
“14h00实验室\n”+
“17点回家\n”+
“21H00F.H.E-??\n”;
字符串sDay=“星期一”;
dSchedule.setText(附表);
dTitle.SETEXT(“星期四+星期四时间表”);
}catch(classnotfounde异常){
e、 printStackTrace();
Log.d(标签“-->”+e);
}捕获(NoSuchFieldException x){
x、 printStackTrace();
Log.d(标记“-->”+x);
}捕获(IllegalArgumentException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
Log.d(标记“-->”+e.getMessage());
Log.d(标记“-->”+e.getCause());
Log.d(标记“-->”+e.getLocalizedMessage());
}捕获(非法访问例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
Log.d(标签“-->”+e);
}
}
}

问题似乎是您误解了
字段
类中方法的用法

TextView dSchedule = (TextView) fDisplay.get(mainActivityClass);
TextView dTitle    = (TextView) fTitle.get(mainActivityClass);
您正在传递对类的引用,但是,根据文档和您看到的异常,您应该提供该类型的正在运行的实例/对象。因此,您真正想要的是传入一个
freesoft.nex.ec.MainActivity
的对象。现在,假设它实际上与代码所在的
MainActivity
类相同,您可能需要做的就是将上述语句更改为:

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

请注意,您不能仅提供
,因为这将引用
MonHandler
内部类的实例。

问题似乎是您误解了
字段
类中方法的用法

TextView dSchedule = (TextView) fDisplay.get(mainActivityClass);
TextView dTitle    = (TextView) fTitle.get(mainActivityClass);
您正在传递对类的引用,但是,根据文档和您看到的异常,您应该提供该类型的正在运行的实例/对象。因此,您真正想要的是传入一个
freesoft.nex.ec.MainActivity
的对象。现在,假设它实际上与代码所在的
MainActivity
类相同,您可能需要做的就是将上述语句更改为:

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

请注意,您不能只提供
这个
,因为它将引用
MonHandler
内部类的实例。

您能给我们您的Logcat语句吗。您能给我们您的Logcat语句吗。