使用java反射从MainActivity类访问私有属性-字段
我试图使用反射来使用MainActivity类的私有属性,但我不知道我做错了什么。有人能帮忙吗。这是我的代码:MainActivity类和 这是我从异常中得到的错误: java.lang.IllegalArgumentException:对象不是该类的实例使用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
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语句吗。