目录
反射允许运行中的 Java 程序获取自身的信息,并且可以操作类和对象的内部属性。
程序中一般的对象类型都是在编译期就确定下来的,而Java 反射机制可以动态的创建对象并调用其属性,这样对象的类型在编译期是未知的。
反射的核心:是 JVM 在运行时 才动态加载类或调用方法或属性,不需要事先(写代码的时候或编译期)知道对象是谁。
java反射就是在运行状态中:
- 对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
这也是Java被视为动态语言的一个关键性。
比如:通过反射生成对象的实例主要有两种方式:
方法一:使用Class对象的newInstance()方法来创建Class对象对应类的实例
方法二:先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例:可以用指定的构造器构造类的实例
创建数组(方法一)
- Class classType = Class.forName("java.lang.String");
- Object array = Array.newInstance(classType, 10);
优点
可以在程序运行的过程中,操作这些对象。
可以解耦,提高程序的可扩展性。
缺点
反射最重要的用途就是开发各种通用框架
1.各种框架:(spring,struts....)用反射,运行时动态加载需要加载的对象。
Spring 框架的 IOC 基于反射创建对象和设置依赖属性。
Spring MVC 的请求调用对应方法,也是通过反射。
JDBC 的 Class#forName(String className) 方法,也是使用反射。
2.各种IDE开发工具:当我们输入一个对象或类并想调用它的属性或方法时,一按点号,编译器就会自动列出它的属性或方法,这里就会用到反射。