1.1 反射的概念:
当我们想要使用别人的东西或者查看某些资源的时候,可以使用反射技术 再比如,开发的时候,有时并不能直接看到源代码,也可以通过反射获取
1.2 反射的前提:获取字节码对象
字节码对象获取的3种方式:
-
类名.class
-
Class.forName(“目标类的全路径”)
-
目标类对象.getClass() 注意: 字节码对象是获取目标对象所有信息的入口
1.3 反射的常用方法
获取包对象:clazz.getPackage() 先获取包对象,再获取包对象的名字:clazz.getPackage().getName() 获取类名: clazz.getName()–打印的是全路径名 clazz.getSimpleName()–打印的只有目标类的类名
package cn.tedu.reflection;
import org.junit.Test;
import java.util.Arrays;
/*本类用于测试反射技术*/
public class TestReflection {
/*单元测试方法
* public + void + 没有参数 + @Test*
注一单元测试工具:Add Junit4 to classPath
* 如果成功,会出现导包语句:import org.junit.Test;*/
@Test
public void getClazz() throws ClassNotFoundException {
//1.练习获取字节码对象的3种方式
Class<?> clazz1 = Class.forName("cn.tedu.reflection.Student");
Class<Student> clazz2 = Student.class;
Class<?> aClass = new Student().getClass();
//打印的是Student类对应的字节码对象
System.out.println(clazz1);//class cn.tedu.reflection.Student
//获取当前字节码对象的名字
System.out.println(clazz1.getName());//cn.tedu.reflection.Student
//通过字节码对象,获取Student类的类名
System.out.println(clazz1.getSimpleName());//Student
//通过字节码对象,获取Student类对应的包对象
System.out.println(clazz1.getPackage());//package cn.tedu.reflection
//通过字节码对象,先获取Student类对应的包对象,再获取这个包对象的名字
System.out.println(clazz1.getPackage().getName());//cn.tedu.reflection
}
@Test
public void getStu() {
//1.创建学生类对象
Student s1 = new Student("张三", 3);
Student s2 = new Student("李四", 4);
Student s3 = new Student("王五", 5);
//2.准备数组将刚刚创建好的学生对象存入
Student[] s = {s1, s2, s3};
//3.直接打印
System.out.println(Arrays.toString(s));//[Student{name='张三', age=3}, Student{name='李四', age=4}, Student{name='王五', age=5}]
//4.遍历学生数组,拿到每一个学生对象
/*中午吃3碗大米饭
玩代码
Student{name='李四', age=4}
中午吃3碗大米饭
玩代码
Student{name='王五', age=5}
中午吃3碗大米饭
玩代码*/
for (Student student :
s) {
System.out.println(student);
student.eat(3);
student.play();
}
}
}
package cn.tedu.reflection;
/*本类用作测试反射的物料类,假装这个类是别人写的*/
public class Student {
//成员变量
String name;
int age;
//2全参构造和无参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
public void play(){
System.out.println("玩代码");
}
public void eat(int n){
System.out.println("中午吃"+n+"碗大米饭");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}