[英]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.