前言
静态语言
运行时结构不可变的语言就是静态语言。如Java、C++等
虽然Java不是动态语言,但Java可以称之为“准动态语言”。
Java有一定的动态性,我们可以利用反射机制获得类似动态语言的特性
Java的动态性让编程的时候更加灵活!
动态语言
指的是运行的时候开源改变其自身结构的语言,如C#,JavaScript,PHP等
例如可以引入新的函数,对象,新的代码
特点:没有强制的数据结构,javaScript 中的 var ,python的无需指明变量类型
即允许在运行时,代码可以根据某些条件改变自身结构!
反射
概述
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
例如:
java">Class classdemo1 = Class.forName("java.lang.String")
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射
反射流程
反射机制提供的功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时获取泛型信息
- 在运行时调用任意一个对象的成员变量和方法
- 在运行时处理注解
- 生成动态代理(AOP)
反射的优点与缺点
优点
动态创建对象和编译,提高程序灵活性
缺点
影响性能
反射主要的API
- java.lang.Class:代表一个类(其实在Object中)
- java.lang.reflect.Method:代表类的方法
- java.lang.reflect.Field:代表类的成员变量
- java.lang.reflect.Constructor:代表类的构造器
获取反射对象
一个类在内存中只有一个class对象,所以你怎么获取都是相同的
类被加载后,类的整个结构都会被封装在Class对象中
代码示例
java">package example.reflect;
public class demo1 {
public static void main(String[] args) throws ClassNotFoundException {
//一个类只有一个class对象
Class stu = Class.forName("example.reflect.entity.Stu");
System.out.println(stu);
}
}
结果截图
该方法返回类型为Class类,是Java反射的源头!