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)学习笔记46:反射机制的更多相关文章

  1. java学习笔记09--反射机制

    java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...

  2. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  3. java学习笔记:反射

    1.什么是反射? Reflection(反射)是被视为动态语言的关键,反射机制允许程序做执行期间借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象内部属性及方法 2.反射相关的 ...

  4. 8.2(java学习笔记)反射

    一.基础知识 对象是表示或封装一些数据,一个类被加载后JVM会创建一个对应该类的Class对象, 类的整个结构信息会被放在对应的对象中,通过这个对象我们可以获取改类的全部信息, 而这些操作称为反射. ...

  5. Java 学习笔记(15)——反射

    Java中的类文件最终会被编译为.class 文件,也就是Java字节码.这个字节码中会存储Java 类的相关信息.在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后 ...

  6. java学习笔记之反射—反射和工厂模式

    简单工厂模式又称为静态工厂方法模式,它是由工厂对象来决定要创建哪一种类的实例化对象. 静态工厂代码: class Factory{ private Factory() {} public static ...

  7. 【java学习笔记】反射基础

    一.反射 反射就是在剖析一个类,了解这个类的构造,创建这个类对应的对象. Class 代表字节码的类,代表类的类 Field 代表属性的类 Method 代表方法的类 Constructor 代表构造 ...

  8. java学习笔记之反射—Class类实例化和对象的反射实例化

    反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,可以采用三种方式完成. java.lang.Class类的定义: public f ...

  9. Java学习笔记__异常机制_try_catch_finally_return执行顺序

    package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  10. Java学习笔记46(多线程三:线程之间的通信)

    多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个 ...

随机推荐

  1. PIE SDK最小噪声变换

    1.算法功能简介 最小噪声分离变换是用于判定图像数据内在的维数(即波段数),分离数据中的噪声,减少随后处理中的计算需求量. MNF 本质上是两次层叠的主成分变换.第一次变换(基于估计的噪声协方差矩阵) ...

  2. javascript 定时任务封装

    /** * 定时任务 * 间隔时间,执行次数,要带的参数,要执行的函数. */ var TimingTask = function(time,count,param,fun){ this.id = - ...

  3. git push的一些坑

    在安装git的时候我们一般会自己设置一个用户名和邮箱,这个一般设置为全局的用户名,如下所示 git config --global user.name "xxx" git conf ...

  4. Java - 打印质数(使用控制嵌套循环跳转)

    使用控制嵌套循环跳转,打印输出10 ~ 150之间的质数 代码: public class Testcotinue { public static void main(String[] args) { ...

  5. bzoj 5305: [Haoi2018]苹果树

    Description Solution \(n\) 个点的二叉树的方案数是 \(n!\) 证明十分显然:新加入的点占掉了 \(1\) 个位置,新加了 \(2\) 个位置,那么多出来一个位置,所以第 ...

  6. JS常用的设计模式(6)——桥接模式

    桥接模式的作用在于将实现部分和抽象部分分离开来, 以便两者可以独立的变化.在实现api的时候, 桥接模式特别有用.比如最开始的singleton的例子. var singleton = functio ...

  7. 用ECMAscript5中的forEach函数遍历数组

    1 var a = [1,2,3]; 2 a.forEach(function(value,index,arr){ 3 arr[index] = value + index; 4 }) 5 conso ...

  8. 到底什么是promise?有什么用promise怎么用

    相信很多人刚接触promise都会晕,但学会后却离不开它,本文详细介绍一下promise,promise解决的问题,帮助新手快速上手 [扫盲] 什么是promise? promise是一种约定,并非一 ...

  9. 错误 6 未能找到类型或命名空间名称“BLL”(是否缺少 using 指令或程序集引用?)

    出现这个错误,要确保先引用BLL.dll, 如果引用之后还没有解决这个问题的话,确认一下程序集FrameWork版本与项目FrameWork版本一致.右击程序集属性可以更改.

  10. python-requests 简单实现数据抓取

    安装包: requests,lxmlrequest包用于进行数据抓取,lxml用来进行数据解析对于对网页内容的处理,由于html本身并非如数据库一样为结构化的查询所见即所得,所以需要对网页的内容进行分 ...