Java-Reflect 专题
参考慕课课程:反射——Java高级开发必须懂的
第1章 Class类的使用
1.1 基本概念
java的反射机制:
- 在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取信息,以及动态调用对象的方法的功能称为java语言的反射机制。
什么是类
- 具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
- 类是对象的模版,对象是类的实例
- 但是 类也是对象 类是java.lang.Class类的实例对象
类类型
Class Class< T >
T - the type of the class modeled by this Class object. For example, the type of String.class is Class. Use Class<?> if the class being modeled is unknown
1.2 Class类的使用
- 类是对象,任何一个类都是java.lang.Class的实例对象,这个实例对象有三种获取方式
-
Class c1 = Fool.class; //实际告诉我们任何一个类都有一个隐含的静态成员变量class
-
Class c2 = fool.getClass();//已知该类的对象,通过getClass方法
-
Class c3 = Class.forName("com.imooc.reflect.Fool");
-
官网上把 c1 or c2 叫做 Fool类的类类型(class type),一个类只可能是Class类的一个实例对象
-
可以通过类的类类型创建该类的实例,需要有无参的构造方法
Fool fool1 = (Fool) c1.newInstance();
第2章 动态加载类
2.1 Java 动态加载类
- Class.forName(“类的全称”),不仅表示了类的类类型,还代表了动态加载类
- 编译时刻加载是静态加载了、运行时刻加载是动态加载类
- new 创建对象时静态加载类,在编译时刻就需要加载所有的可能使用到的类
- 反射的操作都是编译以后的操作
第3章 获取方法信息
3.1 Java 获取方法的信息
-
基本类类型,void的关键字都存在类类型
-
万物皆对象,Method 是方法对象,任何一个方法都是Method对象的实例
-
通过反射获取类方法信息的基本步骤
- 通过以上三种方式获取该类的类类型,即Class类的实例
- 通过Class类提供的方法,获取该类类型的名字,方法,方法参数
-
/* * Method类,方法对象 * 一个成员方法就是一个Method对象 * Class类的方法 * 1.getMethods()方法获取的是所有public的函数,包括从父类继承而来的 * 2.getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限 */
第4章 获取成员变量和构造函数信息
4.1 Java 获取成员变量和构造函数信息
-
/** * 成员变量也是对象 * java.lang.reflect.Field * Field类封装了关于成员变量的操作 * Class类的方法 * 1.getFields()方法获取的是所有public的成员变量的信息 * 2.getDeclaredFields()方法获取的是该类自己声明的成员变量的信息 */
-
/** * 构造函数也是对象 * java.lang.Constructor * Class类的方法 * 1.getConstructors()获取所有public的构造函数 * 2.getDeclaredConstructors()获取改了所有自己声明的构造函数 */
小结:获取类信息
-
获取该类的类类型,万物皆对象。
-
通过类类型获取所需类的信息的实例,Class类提供了大量的方法,可以获取类信息的实例
-
通过类信息实例的方法,进一步获取信息
第5章 方法反射的基本操作
5.1 Java 方法反射的基本操作
-
Q1: 如何获取某个方法?
方法的名称和方法的参数列表才能唯一确定某个方法
-
Q2: 方法反射的操作?
method.invoke(该对象的实例,方法的参数列表)
-
Q3: 为什么要用方法的反射?
指定方法名称调用方法
举个应用的案例 ------>通过标准的JavaBean的属性名获取其属性值
举例:获取A类的 print(int,int)方法步骤
类A定义如下:
class A {
public int print(int x,int y){
return x+y;
}
}
-
首先要获取类的类类型
A a1 = new A(); Class c = a1.getClass();
-
获取方法—>名称和参数列表来决定
Method m = c.getMethod("print", int.class, int.class);
-
方法的反射操作
方法的反射操作是用m对象来进行方法的调用,和a1.print调用的效果一样
方法如果没有返回值返回null,有返回值返回具体的返回值m.invoke(a1,10,20);
第6章 通过反射了解集合泛型的本质
6.1 Java 通过反射了解集合泛型的本质
-
通过Class,Method来认识泛型的本质
-
反射操作都是编译之后的操作
-
Java中集合的泛型,是防止错误的输入的,只有在编译阶段有效, 绕过编译就无效了
-
验证:我们可以通过方法的反射来操作,绕过编译