Android 中利用反射访问private修饰的字段和方法

来源:互联网 发布:cms系统开发教程 编辑:程序博客网 时间:2024/05/22 00:19

        前几天在项目中突然要改动三方集成的样式,但是三方都在jar包中,所以就考虑用反射来访问而且是访问私有的,废话不多说直接上代码:很简单的两个方法


首先看一下我这个Activity里面的代码

public class FanSheActivity extends AppCompatActivity {    private TextView mName;    private TextView mAddress;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_fan_she);        mName = (TextView) findViewById(R.id.id_name);        mAddress = (TextView) findViewById(R.id.id_address);        /**下面我们通过发射来拿到FanShePresenter里面的private修饰变量和方法*/        getNameText();        showgetProsenaddress();    }    /**     * 我们首先来拿到private修饰的字段name     */    public void getNameText() {        Field f;        String name = null;        FanShePresenter mFanShePresenter = new FanShePresenter(this);        Class temp = mFanShePresenter.getClass();        try {            f = temp.getDeclaredField("name");            f.setAccessible(true);            name = (String) f.get(mFanShePresenter);        } catch (Exception e) {            e.printStackTrace();        }        mName.setText(name);    }    /**     * 调用private修饰的方法getProsenaddress()     */    public void showgetProsenaddress() {        Method method = null;        FanShePresenter mFanShePresenter = new FanShePresenter(this);        Class temp = mFanShePresenter.getClass();        try {            method = temp.getDeclaredMethod("getProsenaddress", null);            method.setAccessible(true);            method.invoke(mFanShePresenter, null);        } catch (Exception e) {            e.printStackTrace();        }    }}

下面是要访问的类文件

/** *  */public class FanShePresenter {    private String name;    public String address;    public Context mContext;    public FanShePresenter(Context mContext) {        this.name = "奥巴马";        this.address = "美国五角大楼";        this.mContext = mContext;    }    public void getProsenName() {        Toast.makeText(mContext, "习大大", Toast.LENGTH_LONG).show();    }    private void getProsenaddress() {        Toast.makeText(mContext, "北京天安门", Toast.LENGTH_LONG).show();    }}


1 0