反射的应用场景:
多用于框架和组件,写出复用性高的通用程序,学习反射更好理解框架的内部实现原理.
一.反射的概述
Java反射机制是在运行状态中,对指定的类,任意的方法或任意的字段进行操作,这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。
简而言之,反射就是:在运行时通过代码操作类。
想要操作类,就必须获取类的字节码class对象,通过对class提供的方法的对类进行进一步的解析,从而来实现各种操作
在进行具体操作之前,大家需要先掌握类各个组成的专业描述
Class 类
Constructor
构造方法
Method 方法
Field 字段 / 属性
instance 实例 / 实例对象
invoke 调用, 执行
1.三种获取class对象的方式
1. 通过字符串 (全限定名) 获得. `包名 + 类名`
格式 : Class cls = Class.forName("字符串");
场景 : 开发中, 从配置文件中获取 `全限定类名`, 并通过反射进行所有操作.
public class JunitDemo {
/*
* 1. 通过字符串 (全限定名) 获得. `包名 + 类名`
* 格式 : Class cls = Class.forName("字符串");
* 场景 : 开发中, 从配置文件中获取 `全限定类名`, 并通过反射进行所有操作.
*/
@Test
public void test1() throws ClassNotFoundException{
Class<?> cls = Class.forName("cn.huawei.Demo");
System.out.println(cls);
}
/*
* 2. 通过 Java 类型获取.
* 格式 : Class cls = 类名.class;
* 场景 : 确定方法形参列表时, 需要通过类型获得.
* 例如 : public void init(String s, int i) {}
* 类型对应的Class参数列表为: init(String.class, int.class);
*/
@Test
public void test2() throws ClassNotFoundException{
Class<?> cls = Demo.class;
System.out.println(cls);
}
/*
* 3. 通过实例对象获得.
* 格式 : Class cls = obj.getClass();
* 场景 : 方法内部通过变量名(实例对象名)获得.
* 例如 : public void init(Object obj) {
* obj.getClass();
* }
*/
@Test
public void test3() throws ClassNotFoundException{
Class<?> cls = new Demo().getClass();
System.out.println(cls);
}
}
2.反射实践
提供一个Student类
public class Student {
public static void main(String[] args) {
System.out.println("String的main方法被调用了...");
System.out.println("args[0]=" + args[0] + ", args[1]=" + args[1]);
}
private String name;
private int age;
public String description;
public Student(){
System.out.println("无参构造方法被调用...");
}
public Student(String name, int age) {
System.out.println("带 String name, int age 参数的构造方法被调用...");
this.name = name;
this.age = age;
}
// 私有构造方法
private Student(String name, int age, String description) {
System.out.println("私有构造方法被调用...");
this.name = name;
this.age = age;
this.description = description;
}
// 私有方法
private void show(int num) {
System.out.println("私有方法: " + num);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", description="
+ description + "]";
}
}
1.使用反射调用构造方法创建对象