
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, “红楼梦”);
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月10日 11时49分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
git命令升级版用法
2019-03-04
sed常用命令
2019-03-04
checksec未完待续~
2019-03-04
python pexpect
2019-03-04
inode索引节点的概念
2019-03-04
create-react-app第一步
2019-03-04
testng测试工具简介
2019-03-04
怎么去利用已有的数据做分析?
2019-03-04
某易游戏经典吃豆豆动画404页面源码
2019-03-04
专升本——英语视频学习
2019-03-04
Future education software
2019-03-04
C语言——经典200道实例【基础例题100道——进阶例题100道】
2019-03-04
数据结构——线性表&树&图的【数据元素名称-有无结点-内部之间的关系】的区别
2019-03-04
不知道考研各科课程那个老师的课好?怎么选择安排?在哪找课程课本资料?看这里
2019-03-04
考研高数一_高数二_高数三考试大纲
2019-03-04
【无线传感器网络简明教程-学习笔记8】第八章 无线传感器网络试验
2019-03-04
【考研高数-高等数学-基础】第四章 不定积分
2019-03-04
【考研英语-基础-简单句】简单句的核心变化_谓语情态
2019-03-04
【考研英语-基础-简单句】简单句的核心变化_谓语否定与强调_考场攻略
2019-03-04
基于CC2530的跑马灯实验
2019-03-04