博客
关于我
Android反射的简单使用
阅读量:355 次
发布时间:2019-03-04

本文共 3172 字,大约阅读时间需要 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, “红楼梦”);

转载地址:http://ajre.baihongyu.com/

你可能感兴趣的文章
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
MySQL Join算法与调优白皮书(二)
查看>>
Mysql order by与limit混用陷阱
查看>>
Mysql order by与limit混用陷阱
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
mysql replace用法
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql server has gone away
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
MYSQL sql语句针对数据记录时间范围查询的效率对比
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>