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

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

    一.反射获取成员变量并且使用: 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. LeetCode 200.岛屿的个数

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...

  2. HikariCP配置使用spring结合--Java数据库连接池

    我的个人德州扑克项目https://github.com/mingzijian/pokers,欢迎给星星.maven引入: Java 8 maven artifact: <dependency& ...

  3. TOJ 3744 Transportation Costs

    描述 Minya Konka decided to go to Fuzhou to participate in the ACM regional contest at their own expen ...

  4. Linux kernel workqueue机制分析

    Linux kernel workqueue机制分析 在内核编程中,workqueue机制是最常用的异步处理方式.本文主要基于linux kernel 3.10.108的workqueue文档分析其基 ...

  5. [转]ASP.NET MVC 5 List Editor with Bootstrap Modals

    本文转自:https://www.codeproject.com/articles/786085/asp-net-mvc-list-editor-with-bootstrap-modals With ...

  6. c#学习基础(2)存储、值类型和引用类型、变量

    程序运行时,它的数据必须存储在内存中,数据项需要多大的内存.存储在什么地方以及如何存储都依赖该数据项的类型 运行中的程序使用两个区域来存储数据:栈和堆 栈是一个内存数组,是一个LIFO(last in ...

  7. vs文件属性(生成操作)各选项功能

    右击项目里的文件,选择属性(F4)会有[生成操作]的选项. 它提供了14项选择,如图: 在这说一下常用的选项: 1.编译 编译用于c#代码类的操作,编译之后输出在该程序集的bin目录下.换句话说,代码 ...

  8. package.json中dependencies 和devDependencies的差异

    我们在日常开发中,经常会使用到npm安装对应的包,会经常在package.json中看到dependencies 和devDependencies 二者的区别: devDependencies:是你开 ...

  9. 操作系统-Interrupts

  10. 菜鸟学配置vim

    看啥都不会的菜鸟怎么进行vim配置 如果你想让你的vim和VS差不多你一定需要这个网址 http://www.open-open.com/lib/view/open1429884437588.html ...