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:通过反射获取成员变量和成员方法并且使用的更多相关文章

  1. Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用

    1. 反射获取成员变量并且使用: (1)获取字节码文件对象:         Class c = Class.forName("cn.itcast_01.Person"); (2) ...

  2. java 27 - 4 反射之 通过反射获取成员变量并使用

    类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...

  3. java反射--获取成员变量信息

    获取成员变量信息 代码及说明: public static void printFieldMessage(Object obj) { //要获取类的信息,首先要获取类的类类型 Class c=obj. ...

  4. Java学习笔记之使用反射+泛型构建通用DAO

    PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...

  5. Java学习笔记54(反射详解)

    反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成 ...

  6. Java学习笔记八(反射)

    1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...

  7. Java学习笔记--注解和反射

    注解和反射 1. 注解 注解作用: 对程序做出解释 被其他程序读取 注解格式: @注释名,还可以添加一些参数值,例如@SuppressWarnings(value="unchecked&qu ...

  8. java 反射 - 获取成员变量的值.

    通过反射,可以获取所有声明的成员变量(包括所有的),代码如下: package spt.test.src; public class Person { private String name = &q ...

  9. thinkphp5.0学习笔记(三)获取信息,变量,绑定参数

    1.构造函数: 控制器类必须继承了\think\Controller类,才能使用: 方法_initialize 代码: <?php namespace app\lian\controller; ...

随机推荐

  1. Android版本判断

    尽管Android向下兼容不好,但是一个程序还是可以在多个平台上跑的.向下兼容不好,接口改变,新的平台上不能用旧的API,旧的平台更不可能用新的API,不等于一个平台需要一个APK.可以在高版本的SD ...

  2. Standalone HBase

    This is the default mode. Standalone mode is what is described in the quickstart section. In standal ...

  3. <Stackoverflow> 声望和节制

    什么是声望(reputation)?我是怎样获得(或失去)它的? 声望是一种粗略的测量,用来表示社区对你的信任度.通过让别人相信你知道自己正在讨论什么来获得.对网站的基本使用,包括问一个问题,回答,建 ...

  4. find in linux

    find命令的作用是在目录中根据文件名搜索文件find 列出当前目录及其子目录的所有文件和文件夹的完整路径.find -name Help.java 在当前目录及其子目录中搜索文件名为Help.jav ...

  5. SpringMVC 避免IE执行AJAX时,返回JSON出现下载文件

    <?xml version="1.0" encoding="UTF-8"?> <!-- SpringMVC配置文件 --> <be ...

  6. 几个代码片段-计算程序运行时间+获得当前目录+生成MD5

    计算程序运行时间 long startTime = System.currentTimeMillis(); System.out.println("程序运行时间: " + (Sys ...

  7. 判断滑动方向UITableView

    CGFloat lastContentOffset;  //ScoreView 滑动位置 -(void)scrollViewWillBeginDragging:(UIScrollView*)scrol ...

  8. Contest 7.23(不知道算什么)

    Problem A   URAL 1181 Cutting a Painted Polygon 题目大意就是说有一个N边形,让你做N-3条边,让他们的每个三角形的三个顶点颜色都不相同. 这里有一个引理 ...

  9. 在WinForm中使用Web Service来实现软件自动升级

    来源:互联网 winform程序相对web程序而言,功能更强大编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术 ...

  10. fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址)

    fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址) 最新的Fedora 21终于正式发布了,Fedora Server 是一款强大可定制化的操作系统,包括了最好最 ...