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

你可能感兴趣的文章
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
Moment.js常见用法总结
查看>>
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)
查看>>