反射库(reflection library) 提供了一个非常丰富且精心设计的工具集, 以便编写能够动态操纵 Java 代码的程序。这项功能被大量地应用于 JavaBeans 中,它是 Java 组件的体系结构。 - - - - - - - - - - - - - - - - - - -源于Java核心技术(卷Ⅰ)的引用

在理解反射之前需要了解类加载机制

一、什么是反射

能够分析类能力的程序称为反射(reflective)。

二、获得class类对象的三种方式

在程序运行期间,Java 运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。 虚拟机利用运行时类型信息选择相应的方法执行。
然而,可以通过专门的 Java 类访问这些信息。保存这些信息的类被称为 Class, 这个名字很容易让人混淆。Object 类中的 getClass( ) 方法将会返回一个 Class 类型的实例。

  1. 类名.class(例如:Student.class)
  2. 对象.getClass()
Random generator = new Random():
Class cl = generator.getClass() ;
String name = cl.getName(); // name is set to "java.util.Random"
  1. 还可以调用静态方法 forName 获得类名对应的 Class 对象。
String className = "java.util.Random";
Class cl = Class.forName(className) ;

如果类名保存在字符串中, 并可在运行中改变, 就可以使用这个方法。当然, 这个方法只有在 dassName 是类名或接口名时才能够执行。 否则,forName 方法将抛出一个 checkedexception ( 已检查异常)。无论何时使用这个方法, 都应该提供一个异常处理器(exception handler) 。

String className = "java.util.Random";
Class cl = null;
try {cl = Class.forName(className);
} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();
}

三、通过反射来创建对象(生成类的实例)

//通过反射创建,需要注意此处是需要抛出异常的
Student student = Student.class.newInstance();//通过new
Student student1 = new Student();

两者创建对象是等价的,由此我们可以看出创建对象不一定非等通过new 来实现。

那么我们就要想既然可以通过new来生成实例,为什么还需要反射呢?
解释:我们知道通过new来创建对象比反射生成的实例要快,但是我们可能遇到过一种情况,new没办法使用的时候,比如说我们在使用框架的时候事先不知道这些类,没办法通过new来创建实例,只能通过反射来生成实例。我们是迫不得已的时候才使用反射来生成实例。
还有就是比如我们在使用tomcat开启动web项目的时候,tomcat开发者不知道项目中会有什么类,无法通过new来生成类的实例,所以tomcat容器写了一个类的模板,运行的时候利用反射获取类信息,然后生成对应的实例,然后执行调用方法。

附:简易类加载机制图

四、调用任意方法

在 C 和 C++ 中, 可以从函数指针执行任意函数。从表面上看, Java 没有提供方法指针,即将一个方法的存储地址传给另外一个方法, 以便第二个方法能够随后调用它。事实上,Java 的设计者曾说过:方法指针是很危险的,并且常常会带来隐患。 他们认为 Java 提供的接口(interface) 是一种更好的解决方案。然而, 反射机制允许你调用任意方法

我们来看代码:

1)、我先定义了一个学生类,注意age属性是私有的

public class Student {private int age;@Overridepublic String toString() {return "Student [age=" + age + "]";}}

2)、

public class TestReflect {public static void main(String[] args) {Student student = new Student();try {Field age = Student.class.getDeclaredField("age");//设置可访问非常重要age.setAccessible(true);age.set(student,20);System.out.println(student);System.out.println(age.get(student));} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("------------------------------------------------");try {Method toString = Student.class.getDeclaredMethod("toString");Object invoke;invoke = toString.invoke(student);System.out.println(invoke);} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

运行结果:

1、我们通过第一个try-catch可以看到即使是对象中的私有属性通过反射也是可以访问到的,前提是设置可访问的属性。
2、通过第二个try-catch的应用我们便实现了利用反射机制中的invoke方法来调用对象中的方法,也就是我们通常所说的代理,从这里我们可以看到,反射和代理是在一起使用的。

五、反射的用途

说了这么多,反射的用途到底是什么,反射主要的作用是什么?

通过以上的介绍我们可以总结两句话:
1、通过反射获取类信息;
2、根据类信息生成实例(实例化功能);
3、反射最终的目的是拿到类的实例。

拓展:

反射除了这些,在我们的Spring框架中的应用是很多很多的,比如说ioc和aop,springMVC原理等等都用到了反射机制,反射在框架中应用很广,这是一个非常重要的知识点,对于我们学习web是必须要掌握的。

如果大家有兴趣可以阅读Java核心技术(卷Ⅰ)这本书,里面有对反射机制更详细的讲解。

java反射总结(框架灵魂)相关推荐

  1. Java反射:框架设计的灵魂

    Java反射:框架设计的灵魂 框架:办成品软件,可以在框架的基础上进行开发 反射:将类的各个部分封装成对象,这就是反射机制 反射的好处 在程序运行的过程中,操作这些对象 可以降低程序的耦合性,提高程序 ...

  2. Java 反射:框架设计的灵魂

    作者 l 会点代码的大叔(CodeDaShu) 在学习 Java 反射之前,先让我们看看这几个概念. 01 解释型语言和编译型语言 解释型语言:不需要编译,在运行的时候逐行翻译解释:修改代码时可以直接 ...

  3. Java反射示例教程

    Java反射示例教程 Java Reflection提供检查和修改应用程序的运行时行为的能力.Java中的反射是核心java的一个先进主题.使用java反射我们可以检查一个类,在运行时接口,枚举,获取 ...

  4. java 反射 框架_Java 反射,开发框架必备技能

    通过反射技术我们将上面的统一资源定位付(URL) 映射到Class 相当于 class: news method: list parameter: 2 差不多就是下面样子 class News{ pu ...

  5. Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?

    ava Java 基础这部分一些简单的问题就直接没有放上来. 需要资料的朋友麻烦一键三连之后点此免费获取! 基础: Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)? 谈谈对 ...

  6. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

  7. 12000+字Java反射,一起全面了解Java反射机制,为学习框架铺路

    文章目录 Java反射机制 理解Class类 获取Class类实例 类的加载过程 类加载器ClassLoader 创建运行时类的对象 获取运行时类的结构 调用运行时类的指定结构 动态代理 Java反射 ...

  8. 安卓逆向-new-sec6-4 Java反射相关知识以及平头哥框架hook构造函数 | App发布测试版本感染

    反射机制 app加上这个属性,也能发布测试版本,被成功感染,无需签名和发布那个release版本 APP是E:\1A_androidstudio_project\course4 插件是E:\1A_an ...

  9. Java反射(自己的理解)

    动态语言:运行是代码可以根据某些条件改变自身结构,像js和php,python等,但是我们不像c++,是一门静态语言,可以准确的说我们是一门准动态语言,因为反射让我们具有动态性. 我来直接用我所理解的 ...

最新文章

  1. Java 对象和类 的理解
  2. 线性代数:第一章 线性方程组
  3. 如果CRC等于炒鸡蛋,那么...
  4. Python 进阶_闭包 amp; 装饰器
  5. Nature子刊:视网膜计算使眼睛先于大脑产生视觉信息
  6. linux下运行yolo,deepin(linux)编译安装yolo v4测试效果
  7. 第二节:重写(new)、覆写(overwrite)、和重载(overload)
  8. Geoffrey Hinton大佬经典的《神经网络机器学习》,附PPT下载链接!
  9. saltstack远程操作WINDOWS的POWERSHELL脚本
  10. zabbix多图同屏展示——“聚合图形”简单使用
  11. Mac腾讯会议没声音
  12. from_tensor_slices
  13. JAVA面试题集(2) (转)
  14. 【技术干货】工业触摸屏之电阻屏原理(连载)
  15. 计算机动漫与游戏制作与影视,中职中专计算机动漫与游戏制作专业系列教材·动画与影视后期制作:After Effects CS4技能应用教程...
  16. 标品和非标品如何选品,选品的重要性,店铺怎样布局
  17. 高通语音专题--呼叫保持流程和日志分析
  18. 逃离贼船?新方舟需要我们去创造。
  19. 测试方法的辩证统一 (1)
  20. 小黄鸭坤坤(Python高还原绘图)

热门文章

  1. java语言中猜数游戏设计_JAVA课程设计-猜数游戏 201521123017
  2. 各类特殊开关电源问题解决方案
  3. 教你用简单几个步骤快速重命名文件夹名
  4. CSS !important的作用
  5. 别人总结的英语网站大全
  6. 一:yum源是什么?
  7. 您用Apple One可以省多少钱?
  8. 什么是深度学习算法?
  9. vue 验证是否数字类型_vue.js如何判断输入是否为数字
  10. 注册商标|商标缺乏显著性被驳回?一招搞定!