当我们想要使用别人的东西或者查看某些资源的时候,可以使用反射技术 再比如,开发的时候,有时并不能直接看到源代码,也可以通过反射获取
字节码对象获取的3种方式:
类名.class
Class.forName(“目标类的全路径”)
目标类对象.getClass() 注意: 字节码对象是获取目标对象所有信息的入口
获取包对象: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 + '}'; } }