引用简述文章:https://www.jianshu.com/p/9be58ee20dee
Oracle官方对反射的解释是
Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods,
and constructors to operate on their underlying counterparts, within security restrictions.
The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared
by a given class. It also allows programs to suppress default reflective access control.
简而言之是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁
java.lang.reflect 包下
反射最重要的用途就是开发各种通用框架。
很多框架(比如Spring)都是配置化的(比如通过XML文件配置JavaBean,Action之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象反射最重要的用途就是开发各种通用框架。
当我们在使用IDE(如Eclipse,IDEA)时,当我们输入一个对象或类并想调用它的属性或方法时,一按点号,编译器就会自动列出它的属性或方法,这里就会用到反射
JDBC中,利用反射动态加载了数据库驱动程序。Web服务器中利用反射调用了Sevlet的服务方法。Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。很多框架都用到反射机制,注入属性,调用方法,如Spring。
静态编译:在编译时确定类型,绑定对象即通过。
动态编译:运行时确定类型,绑定对象。
动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public、static等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods
原文:https://www.cnblogs.com/SweetnessInstinct/p/11675248.html