Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用
1. 反射获取成员变量并且使用:
(1)获取字节码文件对象:
Class c = Class.forName("cn.itcast_01.Person");
(2)使用无参构造器创建对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();
(3)获取所有的成员变量:
Field[] fields = c.getFields();//获取所有公共(public)成员变量
Field[] fields = c.getDeclaredFields();//获取所有成员变量
(4)获得单个成员变量:
Field addressField = c.getField("address");
addressField .set(obj, "北京" );// 给obj对象的addressField字段设置值为"北京"
(5)访问私有字段(暴力访问)
Field nameFeild = c.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(obj , "林青霞");
测试代码:
1 package cn.itcast_03;
2
3 import java.lang.reflect.Constructor;
4 import java.lang.reflect.Field;
5
6 /*
7 * 通过发生获取成员变量并使用
8 */
9 public class ReflectDemo {
10 public static void main(String[] args) throws Exception {
11 // 获取字节码文件对象
12 Class c = Class.forName("cn.itcast_01.Person");
13
14 // 获取所有的成员变量
15 // Field[] fields = c.getFields();
16 // Field[] fields = c.getDeclaredFields();
17 // for (Field field : fields) {
18 // System.out.println(field);
19 // }
20
21 /*
22 * Person p = new Person(); p.address = "北京"; System.out.println(p);
23 */
24
25 // 通过无参构造方法创建对象
26 Constructor con = c.getConstructor();
27 Object obj = con.newInstance();
28 System.out.println(obj);
29
30 // 获取单个的成员变量
31 // 获取address并对其赋值
32 Field addressField = c.getField("address");
33 // public void set(Object obj,Object value)
34 // 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
35 addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京"
36 System.out.println(obj);
37
38 // 获取name并对其赋值
39 // NoSuchFieldException
40 Field nameField = c.getDeclaredField("name");
41 // IllegalAccessException
42 nameField.setAccessible(true);
43 nameField.set(obj, "林青霞");
44 System.out.println(obj);
45
46 // 获取age并对其赋值
47 Field ageField = c.getDeclaredField("age");
48 ageField.setAccessible(true);
49 ageField.set(obj, 27);
50 System.out.println(obj);
51 }
52 }
2. 通过反射获取成员方法
(1)通过反射获取无参无返回值成员方法并使用:
代码示例如下:
package cn.itcast_04; import java.lang.reflect.Constructor;
import java.lang.reflect.Method; public class ReflectDemo {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person"); // 获取所有的方法
// Method[] methods = c.getMethods(); // 获取自己的包括父亲的公共方法
// Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法
// for (Method method : methods) {
// System.out.println(method);
// } Constructor con = c.getConstructor();
Object obj = con.newInstance(); /*
* Person p = new Person(); p.show();
*/ // 获取单个方法并使用
// public void show()
// public Method getMethod(String name,Class<?>... parameterTypes)
// 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
Method m1 = c.getMethod("show");
// obj.m1(); // 错误
// public Object invoke(Object obj,Object... args)
// 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数
m1.invoke(obj); // 调用obj对象的m1方法 System.out.println("----------");
// public void method(String s)
Method m2 = c.getMethod("method", String.class);
m2.invoke(obj, "hello");
System.out.println("----------"); // public String getString(String s, int i)
Method m3 = c.getMethod("getString", String.class, int.class);
Object objString = m3.invoke(obj, "hello", 100);
System.out.println(objString);
// String s = (String)m3.invoke(obj, "hello",100);
// System.out.println(s);
System.out.println("----------"); // private void function()
Method m4 = c.getDeclaredMethod("function");
m4.setAccessible(true);
m4.invoke(obj);
}
}
Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用的更多相关文章
- Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用
1. 反射获取成员变量并且使用: (1)获取字节码文件对象: Class c = Class.forName("cn.itcast_01.Person"); (2) ...
- java 27 - 4 反射之 通过反射获取成员变量并使用
类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...
- java反射--获取成员变量信息
获取成员变量信息 代码及说明: public static void printFieldMessage(Object obj) { //要获取类的信息,首先要获取类的类类型 Class c=obj. ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- Java学习笔记54(反射详解)
反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成 ...
- Java学习笔记八(反射)
1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...
- Java学习笔记--注解和反射
注解和反射 1. 注解 注解作用: 对程序做出解释 被其他程序读取 注解格式: @注释名,还可以添加一些参数值,例如@SuppressWarnings(value="unchecked&qu ...
- java 反射 - 获取成员变量的值.
通过反射,可以获取所有声明的成员变量(包括所有的),代码如下: package spt.test.src; public class Person { private String name = &q ...
- thinkphp5.0学习笔记(三)获取信息,变量,绑定参数
1.构造函数: 控制器类必须继承了\think\Controller类,才能使用: 方法_initialize 代码: <?php namespace app\lian\controller; ...
随机推荐
- oracle10~11g在centos5~6版本上安装整体总结如下
1,oracle10g在centos/RedHat5~6主要的安装步骤,我主要记录核心的,别的在此就不多说了,都是些linux基本维护指令,关闭iptables,selinux,或是放行相应的端口,本 ...
- Java中快如闪电的线程间通讯
这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...
- Android实例-屏幕操持常亮(XE8+小米2)
相关资料: http://www.bubuko.com/infodetail-163304.html 结果: 1.打开权限Wake lock为True. 第三方单元: unit Android.JNI ...
- POJ 1308 Is It A Tree? (并查集)
Is It A Tree? 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/M Description A tree is a w ...
- 【Cocos2d-X开发学习笔记】第21期:动画类(CCAnimate)的使用
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 之前我们已经学习过一些方法让节点“动”起来,Co ...
- 斯特灵数 (Stirling数)
@维基百科 在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的. 第一类 s(4,2)=11 第一类Stirling数是有正负的,其绝对值是个元素的项目分 ...
- JMS开发(二):深入PTP,Pub-Sub两种模式
1.PTP模型 PTP(Point-to-Point)模型是基于队列(Queue)的,对于PTP消息模型而言,它的消息目的是一个消息队列(Queue),消息生产者每次发送消息总是把消息送入消息队列中, ...
- 创建类模式(三):创建者(Builder)
定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这使得构件算法和组装方式可以独立应对变化:复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式 ...
- Spring启动时加载数据
程序中也许有会有许多常用的,不会经常更改的数据,我们可以在程序初始化的时候就把他们加载,就不用频繁的加载或者查询. 以下是几个常用的,有COPY收集的,也有自己弄. 1. 实现BeanPostProc ...
- PL/pgSQL的 RETURN NEXT例子
从网上找到例子: 可以说,RETURN NEXT要用在循环中: 例子一: 数据准备: CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT); ...