博客
关于我
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/

你可能感兴趣的文章
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS UC 2013-0-Prepare Tool
查看>>
msbuild发布web应用程序
查看>>
MSCRM调用外部JS文件
查看>>
MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
查看>>
msf
查看>>
MSSQL数据库查询优化(一)
查看>>
MSSQL日期格式转换函数(使用CONVERT)
查看>>
MSTP多生成树协议(第二课)
查看>>
MSTP是什么?有哪些专有名词?
查看>>
Mstsc 远程桌面链接 And 网络映射
查看>>
Myeclipse常用快捷键
查看>>
MyEclipse用(JDBC)连接SQL出现的问题~
查看>>
myeclipse的新建severlet不见解决方法
查看>>
MyEclipse设置当前行背景颜色、选中单词前景色、背景色
查看>>
MyEclipse配置SVN
查看>>
MTCNN 人脸检测
查看>>
MyEcplise中SpringBoot怎样定制启动banner?
查看>>