Java的反射机制是构建框架技术的基础,功能强大且复杂。使用其可以编写能够动态操纵Java代码的程序。在Java中,反射机制是指在运行状态,对于任意一个类,都可以知道该类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取信息以及动态调用对象方法的功能称为反射机制。
注意:Java不是动态语言。动态语言是能在程序运行时允许改变程序结构或变量类型的语言。
Java反射可以实现的功能:
在程序运行时判断任意一个对象所属的类、调用任意一个对象的方法、构造任意一个类的对象、判断任意一个类所具有的方法和属性、生成动态代理。
Java反射应用场合:
Java程序中许多对象在运行时都会出现两种类型,即编译时类型和运行时类型,编译的类型由声明该对象时所使用的类型决定,运行时的类型由实际赋给该对象的类型决定。
如 Person stu = new Student();
因为对象stu是引用类型,在编译时其类型由Person来确定。而在程序运行后发现stu引用的其实是Student。因为只有在程序运行的时候才能知道stu引用的内容改为了sStudent,故称为运行时类型。
此外,程序在运行时还可能接收到外部传入的一个对象,该对象的编译时类型是Object,但程序又需要调用该对象的运行时类型的方法。为解决这种问题,程序需要在运行时发现对象和类的真是信息。这时就可使用反射。
Java反射API中重要的类:
java.lang.Class:反射的核心类,可以获取类的属性、方法等信息。Java反射机制所有的操作都是围绕该类来展开的。
java.lang.reflect.Field:表示类的属性,可以获取、设置类中属性的值;
java.lang.reflect.Method:表示类的方法,可以用来获取类中方法的信息,或者执行方法;
java.lang.reflect.Constructor:表示类的构造方法。
反射机制的使用步骤:
1.获取想要操作的类的Class对象;
2.调用CLass对象的方法;
3.使用反射API来操作这些信息。
Java程序中,每个类被加载后,系统就会为该类生成一个对应的CLass对象,通过该Class对象就可以访问到虚拟机中的这个类。
获取Class对象通常有三种方式:
1.调用Object类的getClass()方法(这种方法需要在编译器就知道类的名字)
2.调用某个类的class属性
Employee.class
3.使用Class类的forName(String className)静态方法,该方法需要类的完全限定名作参数,需要捕捉ClassNotFoundException异常
try { Class.forName("com.umbrella.java8.Employee"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
使用第二种方式较为妥当。因为程序性能更好,无须调用方法,而是获取属性。且代码更安全,程序在编译阶段就可以检查需要访问的Class对象是否存在。
Class类实际上是一个泛型类,它将已经抽象的概念变得更加复杂。故而在大多数实际问题中,可以忽略类型参数,使用原始的Class类。
一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类。如,long不是类,但long.class是一个Class类型的对象。
b