Android(java)学习笔记106-2:反射机制
1. 反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
获取任何相应.class文件对应的Class类型的对象,然后利用这个对象去调用该.class文件中任意成员变量和方法。
但是获得.class文件的Class类对象是重点,怎么获取呢?
(1)Class类:
成员变量: 类Field,通过这个表示成员变量的类的对象,去调成员变量
构造方法: 类Constructor,通过这个表示构造方法的类的对象,去调构造方法
成员方法: 类Method,通过这个表示成员方法的类的对象,去调成员方法
Class类的成员变量、构造方法和成员方法都是类。
(2)获取.class文件的Class类对象的三种方式:
方式1:Object类的getClass()方法
Person p = new Person();
Class c = p.getClass();
注意:倘若:
Person p = new Person();
Class c = p.getClass();
Person p2 = new Person();
Class c2 = p.getClass();
System.out.println(c == c2);// true Class类是抽象总结,自然也表示一个类
Class类是其他类的抽象总结,它里面的成员变量,构造方法,成员方法都是一样,是对应的抽象的总结,自然也表示一个类。
方式2:数据类型(基本类型和引用类型)的静态属性class
Class c3= Person.class;
System.out.println(c == c3);// true 虽然获取Class对象的方式不一样,但是Class类是抽象总结,自然也表示一个类
类似有Class c1 = int.class;
Class c2 = String.class;
方式3:Class类中的静态方法
public static Class forName(String className)
使用:
Class c4 = Class.forName("cn.himi.Person");
System.out.println(c == c3);// true 虽然获取Class对象的方式不一样,但是Class类是抽象总结,自然也表示一个类
特别注意的是:forName方法的参数为全路径,就是 "包名+类名",就比如这里的cn.himi.Person
(3)开发时候使用方式3:
为什么呢? 因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中
package cn.itcast_01; /*
* 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
*
* Person p = new Person();
* p.使用
*
* 要想这样使用,首先你必须得到class文件对象,其实也就是得到Class类的对象。所有的Class文件都是Class类的对象
* Class类:
* 成员变量 类Field,通过这个表示成员变量的类的对象,去调成员变量
* 构造方法 类Constructor,通过这个表示构造方法的类的对象,去调构造方法
* 成员方法 类Method,通过这个表示成员方法的类的对象,去调成员方法
* 也就是Class类是其他类的抽象总结,它里面的成员变量,构造方法,成员方法都是一样,是对应的抽象的总结,自然也表示一个类。类中成员也是类
* 获取class文件对象的方式:
* A:Object类的getClass()方法
* B:数据类型的静态属性class
* C:Class类中的静态方法
* public static Class forName(String className)
*
* 一般我们到底使用谁呢?
* A:自己玩 任选一种,第二种比较方便
* B:开发 第三种
* 为什么呢?因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。
*/
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
// 方式1
Person p = new Person();
Class c = p.getClass(); Person p2 = new Person();
Class c2 = p2.getClass(); System.out.println(p == p2);// false
System.out.println(c == c2);// true // 方式2
Class c3 = Person.class;
// int.class;
// String.class;
System.out.println(c == c3); // 方式3
// ClassNotFoundException,必须带包名的全路径,比如如果是Class c4 = Class.forName(“Person”);这样是不行的
Class c4 = Class.forName("cn.itcast_01.Person");
System.out.println(c == c4);
}
}
Android(java)学习笔记106-2:反射机制的更多相关文章
- Android:日常学习笔记(9)———探究广播机制
Android:日常学习笔记(9)———探究广播机制 引入广播机制 Andorid广播机制 广播是任何应用均可接收的消息.系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播.通过将 In ...
- Android(java)学习笔记46:反射机制
1. 反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- Java学习笔记54(反射详解)
反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成 ...
- Java学习笔记--注解和反射
注解和反射 1. 注解 注解作用: 对程序做出解释 被其他程序读取 注解格式: @注释名,还可以添加一些参数值,例如@SuppressWarnings(value="unchecked&qu ...
- Java学习笔记八(反射)
1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- java学习笔记09--反射机制
java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
随机推荐
- HDU4456-Crowd(坐标旋转+二位树状数组+离散化)
转自:http://blog.csdn.net/sdj222555/article/details/10828607 大意就是给出一个矩阵 初始每个位置上的值都为0 然后有两种操作 一种是更改某个位置 ...
- CodeForces 455C Civilization (并查集+树的直径)
Civilization 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/B Description Andrew plays a ...
- JSF 2 multiple select listbox example
In JSF, <h:selectManyListbox /> tag is used to render a multiple select listbox – HTML select ...
- Flask框架获取用户IP地址的方法
本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最 ...
- Linux平台部署varnish 高性能缓存服务器
一:varnish部署前准备: 1.1相关软件以及系统,web服务 系统要求:Centos 6(以上) (64位) 相关中间件:varnish-4.0.2 1.2相关系统依赖包安装检查准备 1.2.1 ...
- JAVA 反射应用:properties2Object
MixAll.java import java.lang.reflect.Method; import java.util.Properties; public class MixAll { /** ...
- ios 调试
http://www.cnblogs.com/weilaikeji/p/3306597.html http://www.cnblogs.com/Twisted-Fate/p/4760156.html ...
- cocos2d-x CCScrollView
转自:http://www.cnblogs.com/dcxing/archive/2012/12/31/2840217.html ScrollView一般用在游戏的关卡选择这种类似的场景还有帮助这种场 ...
- 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等
今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...
- 又来折腾Linux
硬盘坏了之后就没装过Linux了,因为弄了一个很老的台式机的80G并口硬盘,根本不够用的,一直懒得理. 前段时间实验室的老机子得报销了,但是里面的东西还可以拆下来,所以又拆下了两个硬盘,这样就有三个8 ...