目录
什么是反射?
反射的作用
反射的优缺点
反射的用途
什么是反射?
- 动态语言。 当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。
- Java 并不是动态语言,但是它却又一个非常突出的动态相关的机制,俗称:反射。
反射允许运行中的 Java 程序获取自身的信息,并且可以操作类和对象的内部属性。
程序中一般的对象类型都是在编译期就确定下来的,而Java 反射机制可以动态的创建对象并调用其属性,这样对象的类型在编译期是未知的。
反射的核心:是 JVM 在运行时 才动态加载类或调用方法或属性,不需要事先(写代码的时候或编译期)知道对象是谁。
java反射就是在运行状态中:
- 对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
这也是Java被视为动态语言的一个关键性。
反射的作用
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个对象所属的类;
- 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
- 在运行时调用任意一个对象的方法
比如:通过反射生成对象的实例主要有两种方式:
方法一:使用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开发工具:当我们输入一个对象或类并想调用它的属性或方法时,一按点号,编译器就会自动列出它的属性或方法,这里就会用到反射。