Android反射的简单使用
发布日期:2021-05-07 14:11:07 浏览次数:16 分类:原创文章

本文共 3171 字,大约阅读时间需要 10 分钟。

通过反射方法调用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, “红楼梦”);

上一篇:监听CPU和内存占用率脚本
下一篇:线程池的封装和使用(二)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月10日 11时49分26秒