Java反射机制
在这之前首先得有一定java基础
IDEA通过类名就能点出方法、成员变量,那么IDEA是如何知道类里面有什么方法、成员变量的?
什么是反射?
反射是一种机制,可以通过该机制在程序运行过程中对类进行解剖,解剖之后就可以操作类的所有成员。
反射是一种变态的机制,在反射面前所谓的私有都是浮云,看下文。
反射的使用场景
*开发IDE(集成开发环境,英文名:Integrated Development Environment):IDE具体是什么不做解释,自行百度,一般人接触不到。
开发框架:一个牛的框架肯定会用到反射
*框架:类库,一堆类放在一起的一个后缀jar的架包,其他自行百度。
*学习框架:初学者学反射为了学框架,也需要会反射,从上可理解不解释
构造方法:通过反射操作构造方法创建对象
成员方法:通过反射操作成员方法调用该成员方法
成员变量:通过反射操作成员变量给成员变量赋值和取值
反射前提条件:获得类对应的Class对象
.java文件编译后成为.class文件,class文件加载中jvm截取文件内容获得class文件的东西(成员变量、方法),然后把这些东西封装成class对象
Class文件:字节码文件
反射就是通过class对象来操作的
.java:死去的你
编译:投胎
Class:在奈何桥喝过汤的你
程序运行:投胎过程
已经加载到内存:现在的你
你的前世死去后去投胎,喝了孟婆汤后跳下凡间,在来到凡间之前一秒你跟阎王签下了今生契约,契约包含了你今生今世所有故事,这就是你的命!这份契约就是class对象,通过契约就可以操作你的命,就好比僧悟空闹阎王那时候划生死账簿得永生。
Class有该对象所有信息
获得class方式
- 方式1:通过类名点class获得class对象
- 语法:Class 对象名 = 类名.class;
- 方式2:通过对象调用getClass方法获取Class对象
- 语法:Class对象名 = 对象名.getClass;
- 方式3:通过Class类的静态方法forName(“类全名”)方法获取
- 语法:Class 对象名 = Class.forName(“类全名”);
需要处理找不到类异常ClassNotFoundException
用的比较多的是第三种
public static void main(String[] args) throws ClassNotFoundException {
//字符串
String str = "反射";
//通过类名点class获得class对象
Class strClass1 = String.class;
System.out.println(strClass1);//class java.lang.String
//通过对象调用getClass方法获取Class对象
Class strClass2 = str.getClass();
System.out.println(strClass2);//class java.lang.String
//strClass1跟strClass2比较是否相等
System.out.println(strClass1 == strClass2);//true 相等
//通过Class类的静态方法forName(“类全名”)方法获取
Class strClass3 = Class.forName("java.lang.String");//class java.lang.String
System.out.println(strClass3);
//strClass1跟strClass3比较是否相等
System.out.println(strClass1==strClass3);//true 相等
}
Class对象常用方法
*获得类全名
String getSimpleName()
*获得类名
String getName()
*创建类的对象
T newInstance()
*在JDK9.0已过时,需要抛出异常IllegalAccessException, InstantiationException,
默认走无参构造
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
Class c1 = Student.class;
System.out.println(c1.getName());//com.***.反射机制.Student
System.out.println(c1.getSimpleName());//Student
System.out.println(c1.newInstance());//com.***.反射机制.Student@4b6995df
}
扯了那么久还进入主题哈!下文Constructor类