1. JAVA的反射机制是什么?
1.1 反射原理
(1)Java反射机制(Java Reflection)是Java语言中一种动态(运行时)访问、检测 & 修改它本身的能力,主要作用是动态(运行时)获取类的完整结构信息 & 调用对象的方法~
更简单点的说就是Java程序在运行时(动态)通过创建一个类的反射对象,再对类进行相关操作,比如:
- 获取该对象的成员变量 & 赋值
- 调用该对象的方法(含构造方法,有参/无参)
- 判断该对象所属的类
通俗的说就是:
(2) 一般情况下,我们使用某个类,都会知道这个类,以及要用它来做什么,可以直接通过new实例化创建对象,然后使用这个对象对类进行操作,这个就属于正射~
(3) 而反射则是一开始并不知道要初始化的是什么类,无法使用new来实例化创建对象,主要是通过JDK提供的反射API来实现,在运行时才知道要操作的是什么类,并且可以获取到类的完整构造以及调用对应的方法,这就是反射~
1.2 反射案例
代码如下:
package com.justin.java.lang;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Student {
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public static void main(String[] args) throws Exception{
//一、正射调用过程
Student student = new Student();
student.setId(1);
System.out.println("正射调用过程Student id:" + student.getId());
//二、反射调用过程
Class clz = Class.forName("com.justin.java.lang.Student");
Constructor studentConstructor = clz.getConstructor();
Object studentObj = studentConstructor.newInstance();
Method setIdMethod = clz.getMethod("setId", int.class);
setIdMethod.invoke(studentObj, 2);
Method getIdMethod = clz.getMethod("getId");
System.out.println("正射调用过程Student id:" + getIdMethod.invoke(studentObj));
}
}
输出结果:
1. 正射调用过程Student id:1
2. 反射调用过程Student id:2
例子反射的调用过程,可以看到获取一个类的反射对象,主要过程为:
- 获取类的Class实例对象
- 根据Class实例对象获取Constructor对象
- 再根据Constructor对象的newInstance方法获取到类的反射对象
获取到类的反射对象后,就可以对类进行操作了~ 例如,上述示例中对类的方法进行调用过程为:
- 根据Class实例对象获取到类的Method对象
- 再根据Method对象的invoke方法调用到具体类的方法
上面示例反向调用过程中我们是通过Class.forName(“类的全局定名”)这种方式来获取到类的Class实例对象,除了这种,常用的还有其他两种
2. Java反射机制中获取Class的三种方式及区别?
2.1 Class的三种获取方式
获取类的java.lang.Class实例对象,常见的三种方式分别为:
- 通过Student.class获取,这里的Student指具体类~~
- 通过Class.forName(“类的全局定名”)获取,全局定名为包名+类名
- 通过new Student().getClass()获取,这里的Student指具体类~