一、认识Class
要想理解反射,首先要了解什么是类型信息。
Java让我们在运行时识别对象和类的信息,主要有2种方式:
一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息;
另一种是反射机制,它允许我们在运行时发现和使用类的信息。
- RTTI:(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
- Class类的使用
1.1 Class对象是什么?
Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象。
类是对象,类是java.lang.Class类的实例对象
任何一个类都是 Class 的实例对象,这个实例对象有三种表示方法:
- 通过
类.class
获取 - 通过
实例对象.getclass()
获取 - 通过
Class.forName(全类名)
获取。
第一种 类名.class
--> 这表示任何一个类都有一个隐含的静态成员变量class
比如我们先创建一个类 Fish
public class Fish {
public void say(){
System.out.println("冒个泡");
}
}
那么第一种创建方式:
public class Main {
public static void main(String[] args) {
// 第一种创建方式
Class fishClass_1 = Fish.class;
}
第二种创建方式:
通过已知该类的对象,通过 getClass
方法 获取该类
// 拿到 类Fish 的实例对象 fish
Fish fish = new Fish();
// 通过 实例对象 fish 获取到 Fish的类类型。
Class fishClass_2 = fish.getClass();
第三种创建方式:
通过 Class.forName("该类的全路径");
Class fishClass_3 = null;
try {
fishClass_3 = Class.forName("com.study.reflection.Fish");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
这样,我们就获取到了类的类类型。
我们可以通过类的类类型来创建该类的实例,使用class..newInstance();
try {
// 前提是要有无参的构造方法
Fish f = (Fish) fishClass_1.newInstance();
f.say();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
打印结果:
冒个泡
文章链接:
Java 反射学习笔记(一)认识Class
java 反射学习笔记(二)方法的反射
java 反射学习笔记(三)通过反射机制,绕过编译时泛型检测
java 反射学习笔记(四)反射的基本操作和用法