java 语言的反射机制

- 在运行状态中,对于任意一个类 (class 文件),都能够知道这个类的所有属性和方法;
- 能动态获取类中的信息,也可以理解为对类(字节码文件)的解剖

描述字节码文件的类

与反射相关的三个对象

- Constuctor : 将构造函数封装成对象
- Field : 将字段封装成对象
- Method : 将一般方法封装成对象

获取字节码对象的三种方式

  1. Object 类中的 getClass() 方法

    • 想要用这种方式获取, 必须要明确具体的类, 并且需要创建对象
  2. 任何数据类型都具备一个静态的属性, 即通过.class来获取其对应的 Class 对象

    • 相对简单, 但是还是要明确用到类中的静态成员
  3. 只有通过给定的类的字符串名称就可以获取该类, 此方法更为扩展

    • 可以使用 Class 类中的 forName() 方法完成
    • 这种方式只要有名称即可, 更为方便, 扩展性更强

获取 Class 中的构造函数

// 早期: 使用 new 创建对象, 先根据被 new 的类的名称找寻该类的字节码文件, 并加载进内存,
// 然后创建该字节码文件对象, 接着创建该字节码文件的对应的 Person 对象
cn.itcast.bean.Person p = new cn.itcast.bean.Person(); // 现在: 使用反射机制
String name = "cn.itcast.bean.Person"; // 找寻该名称对应的类文件, 并加载进内存, 产生 Class 对象
Class clazz = Class.forName(name);
// 如何产生该类的对象呢?
Object obj = clazz.newInstance(); // 调用空参的构造函数 /*
* 当获取指定名称对应类所体现的对象时,
* 该类初始化不使用空参数构造函数该怎么办呢?
* 构造函数带有了参数,就相当于指定了类中的某一个构造函数.
* 既然通过指定的构造函数进行对象的初始化,
* 所以应该先获取到该构造函数, 而这只需要通过字节码文件对象即可完成
* 该方法有:
* getConstructors(); 获取所有公共的构造函数
* getDeclaredConstructors(); 获取所有构造函数.(包含公共, 保护, 默认访问和私有构造方法)
* getConstructor(Class<?>... parametreTypes);
*/ // 获取指定的构造函数对象
// 任何数据类型都具有一个静态的属性, .class, 获取 Class 对象
Constructor constructor = clazz.getConstructor(String.class,int.class); // 通过该构造器对象 newInstance 方法进行对象的初始化
Object obj = constructor.newInstance("张三",18);

获取 Class 中的字段

    String name = "cn.itcast.bean.Person";

// 找寻该名称对应的类文件, 并加载进内存, 产生 Class 对象
Class clazz = Class.forName(name); // 获取相应的字段
// Field field = clazz.getField("age"); 只能获取公有的
Field field = clazz.getdeclaredField("age"); // 只获取本类, 但包含私有 // 对私有字段的方位取消权限检查, 暴力访问
field.setAccessible(true); // 因为 Person p = new Person();
// 设置 p 对象的年龄: p.age = 30;
// 所以反射机制中获取(设置)字段的值,需要指定对象
Object obj = clazz.newInstance(); // 设置值
field.set(obj,89);
// 获取值
Object o = field.get(obj);

获取 Class 中的方法

// 找寻该名称对应的类文件, 并加载进内存, 产生 Class 对象
Class clazz = Class.forName( "cn.itcast.bean.Person"); Method[] methods = clazz.getMethods(); // 获取的都是公有的方法 methods = clazz.getDeclaredMethods(); // 只获取本类中所有方法, 包含私有 // 获取指定名称的公有方法, 需要指定方法名称和参数列表
Method method = clazz.getMethod("show", null); // 获取空参数的一般方法 // 创建对象
Object obj = clazz.newInstance(); // 一般方法的运行, 需要指定对象和参数列表
method.invoke(obj,null); // 获取有参的一般方法
Method method = clazz.getMethod("paramMethod", String.class, int.class); // 创建对象
Object obj3 = clazz.newInstance(); // 一般方法运行
method.invoke(obj,"小强",24);

**参考资料**

Java 之反射机制的更多相关文章

  1. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  2. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  3. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  4. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  5. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  6. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  7. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  8. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  9. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

  10. 【转】java原理—反射机制

    一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...

随机推荐

  1. [svc]几种访问google方案

    最近老被人问起,有什么访问谷歌的方法可以推荐. 针对小白用户(使用sass式即可) iass sass pass区别 小白可以用(无需安装软件,些许收费):googlegae: https://m.2 ...

  2. Android 开发手记二 C可执行程序编译实例(转帖)

    http://www.cnblogs.com/gaozehua/archive/2011/09/02/2164077.html

  3. Ajax同步与异步优缺点与使用

    一.什么是同步请求:(false)       同步请求即是当前发出请求后,浏览器什么都不能做,必须得等到请求完成返回数据之后,才会执行后续的代码,相当于是排队,前一个人办理完自己的事务,下一个人才能 ...

  4. java实现word转pdf文件(高效不失真)

    import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.aspectj ...

  5. CCNA2.0笔记_子网划分

    http://files.cnblogs.com/files/airoot/%E5%AD%90%E7%BD%91%E5%88%92%E5%88%86.zip 网络 默认子网掩码 A类 255.0.0. ...

  6. [转]ubuntu安装gcc

    Ubuntu缺省情况下,并没有提供C/C++的编译环境,因此还需要手动安装. 如果单独安装gcc以及g++比较麻烦,幸运的是,为了能够编译Ubuntu的内核,Ubuntu提供了一个build-esse ...

  7. (转)RISC-V结构逻辑图

    转载地址:http://blog.csdn.net/zzwu/article/details/54810162 说明: 执行6级流水作业: 1. fetch(取指) 2. decode(译码) 3. ...

  8. 解决微信小程序中Date.parse()获取时间戳IOS不兼容的问题(IOS为NaN的问题)

    前端同事在做微信小程序时发现IOS获取的时间戳为空的问题,后来通过跟踪发现,原来是因为IOS系统不支持2017-01-01格式的时间导致的, var mydata = '2017-01-01 11:0 ...

  9. Link-based Classification相关数据集

    Link-based Classification相关数据集 Datasets Document Classification Datasets: CiteSeer: The CiteSeer dat ...

  10. Des加密方法

    //默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; private st ...