Android反射的简单使用

通过反射方法调用DemoData中的私有方法。
DemoData.java

public class DemoData {
    private int id;
    private String name;
    private String title;

    private int getId() {
        return id;
    }

    private void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
public class MainActivity extends AppCompatActivity {
    private final static String TAG = "Reflection";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setDemoData();
    }

    public void setDemoData(){
        Class<?> clz = null;
        try {
            clz = Class.forName("com.demo.audiodemo.DemoData");
            Object obj1 = clz.newInstance();
            Object obj2 = clz.newInstance();
            Method setId = clz.getDeclaredMethod("setId", int.class);   //注意访问私有变量的方法
            Method setName = clz.getMethod("setName", String.class);
            Method setTitle = clz.getMethod("setTitle", String.class);
            setId.setAccessible(true);                                         //注意访问私有变量的方法
            Method getId = clz.getDeclaredMethod("getId");
            Method getName = clz.getMethod("getName");
            Method getTitle = clz.getMethod("getTitle");
            getId.setAccessible(true);
            setId.invoke(obj1, 123);
            setName.invoke(obj1, "红楼梦");
            setTitle.invoke(obj1, "枉凝眉");

            setId.invoke(obj2, 456);
            setName.invoke(obj2, "Sophie Zelmani");
            setTitle.invoke(obj2, "Going Home");
            int id1 = (int) getId.invoke(obj1);
            String name1 = (String) getName.invoke(obj1);
            String title1 = (String) getTitle.invoke(obj1);

            int id2 = (int) getId.invoke(obj2);
            String name2 = (String) getName.invoke(obj2);
            String title2 = (String) getTitle.invoke(obj2);

            Log.i(TAG, "get id1=" + id1);
            Log.i(TAG, "get name1=" + name1);
            Log.i(TAG, "get title1=" + title1);

            Log.i(TAG, "get id2=" + id2);
            Log.i(TAG, "get name2=" + name2);
            Log.i(TAG, "get title2=" + title2);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

总结:
//获取类
clz = Class.forName(“com.demo.audiodemo.DemoData”);

//获取类的实例
Object obj1 = clz.newInstance();

//获取私有方法,并设置访问
Method setId = clz.getDeclaredMethod(“setId”, int.class);
setId.setAccessible(true);

//获取共有方法, String.class和int.class未方法参数类型
Method setName = clz.getMethod(“setName”, String.class);

//方法调用
setId.invoke(obj1, 123);
setName.invoke(obj1, “红楼梦”);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值