目录
- 前言
- 一、反射的概念
- 二、Java 反射相关的API 简介
- 三、Class对象
-
- 常用的获取Class对象的3种方式:
- 四、反射机制的优缺点
-
- 优点:
- 缺点:
- 四、反射机制的功能
前言
关键性质:
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时通过反射API取得任何一个已知名称的类的内部信息,包括其访问修饰符、父类、实现的接口,也包括属性和方法的所有信息,并可在运行时改变属性值或进行方法调用。Java 反射机制容许程序在运行时加载、探知、使用编译期间完全未知的类。也就是说,Java 可以加载一个运行时才得知名称的类,并且获得其完整结构信息,这种动态获取信息以及动态调用对象的成员的功能称为java语言的反射机制。
一、反射的概念
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。Java反射机制被称为框架设计的灵魂。
Class类:
以上的总结就是是反射的概念,通俗来讲:
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。其中这个Class对象很特殊。我们先了解一下这个C lass类。
二、Java 反射相关的API 简介
位于java.lang.reflect 包中
- Class 类:代表一个类。
- Filed 类:代表类的成员变量。
- Method 类:代表类的方法。
- Constructor 类:代表类的构造方法。
- Array 类:提供了动态创建数组,以及访问数组的元素的静态方法, 该类中的所有方法都是静态方法 。
三、Class对象
要想使用反射,首先需要获得待操作的类所对应的Class对象。
Java中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。
这个Class对象是由JVM生成的,通过它能够获悉整个类的结构。
常用的获取Class对象的3种方式:
- 使用Class类的静态方法。
Class.forName(“java.lang.String”);使用类的.class语法。如:
- 使用类的.class语法。
String.class;
- .使用对象的getClass()方法。
String str = “aa”;
Class<?> classType1 = str.getClass();
getClass()方法定义在Object类中,不是静态方法,需要通过对象来调用,并且它声明为final,表明不能被子类所覆写。直接print所获得的Class对象classType会输出:
class 完整类名
如果调用该Class对象的getName()方法,则输出完整类名,不加class。
四、反射机制的优缺点
优点:
在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
缺点:
- 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
- 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
四、反射机制的功能
Java 反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类。
- 在运行时构造任意一个类的对象。
- 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private 方法)。
- 在运行时调用任意一个对象的方法。(注意:前提都是在运行时,而不是在编译时)