在反射面前,你里面的东西都是透明的,里面的属性(也就是private Integer id)和方法(输出,打印,构造方法,get和set,还有tostring),在反射面前都能给你看的清清楚楚,然后反射可以调用这个类里面的所有方法,这种动态获取信息以及动态调用对象类里面的方法的功能叫做java语言的反射机制,反射使java语言这种静态编译型语言有了动态性。
所有的学生都有一个共同特征类Student,所有的人都有一个共同特征Person,所有的老师有一个共同特征,那么所有的类有没有共同特征,所有的属性,所有的构造方法,所有的方法也有共同特征,反射嘛,把这些属性,方法,再往前看一步。你既然叫类,那么你肯定满足它的所有条件啊。
建立类的时候,先拿到字节码对象,再拿到Field,再弄Constructor,最后捣鼓method。
字节码对象即Class类对象(这里的Class是一个类,并不是我们定义类的时候使用class关键字,这是值得注意的地方),每一个类的的.class文件就是一个字节码对象, .class文件我们知道,是我们编写的代码经过编译之后生成的文件,这个文件包含了源码里面的类的所有信息,既然如此,通过字节码对象就可以获取到类的所有信息.。
三种方式获得字节码对象:
//1. Class.forName("完整的包名+类名")
Class clazz1 = Class.forName("com.situ.Day21.reflect.Student");
System.out.println("clazz1 = "+clazz1);
//2. 类型.class
Class clazz2 = com.situ.Day26.Student.class;
System.out.println("clazz2 = "+clazz2);
//3. 对象.getClass()
com.situ.Day26.Student student = new com.situ.Day26.Student();
Class clazz3 = student.getClass();
System.out.println("clazz3 = "+clazz3);
2.构造方法,你得先拿到这个字节码对象,
getConstructors(只能拿到public的构造方法),或者getDeclaredConstructors,(甭管是private还是public的都能获取到),还有拿到构造方法的修饰符,constructor.getModifies(),private
还是public,1代表public,2代表private。 有的可以返回指定参数的构造方法
3.