1.为什么有反射?
Java是一门静态语言,运行时结构不能改变,编程的灵活性受到极大限制
Java的设计者决定用反射来解决问题,有了反射,Java又成为“准动态语言”
反射的英语:reflection
2.反射做了什么?
我们知道,当类中属性,方法private后,我们是不可以直接读取的,只能通过构造方法来实现set和get获取,而反射机制允许程序运行时读取和操作类的任何内部信息,如类名,类方法,类属性,当然,这也存在安全性问题。
在加载完类后,堆内存的方法区会产生一个Class类型的对象,这个对象包含完整的类的信息。这个对象就像一面镜子,Java的设计者非常形象的将这一技术命名为反射。
3.反射用法
一个类只有一个class对象
传统创建对象:
Student student = new Student();
反射用法1:
Class c1 = Class.forName("Student");
反射用法2:
Class c2 = Student.class;
4.获取类的属性
//只能获取public的属性
Class c1 = Class.forName("Student");
Field[] f1 = c1.getFields();
//可以获取全部的属性
Class c1 = Class.forName("Student");
Field[] f1 = c1.getDeclaredFields();
for (Field field : f1) {
System.out.println(field);
}
5.获取类的方法
//只能获取public的方法
Class c1 = Class.forName("Student");
Method[] m1 = c1.getMethods();
for (Method method : m1) {
System.out.println(method);
}
//可以获取全部的方法
Method[] m1 = c1.getDeclaredMethods();
for (Method method : m1) {
System.out.println(method);
}
6.Java 动态创建对象执行方法
//获取Class对象
Class c1 = Class.forName("Student");
//创建一个对象(无参构造类型)
Student stu1 = (Student) c1.newInstanc
//通过构造器创建对象(有参数)
Constructor Constructor = c1.getDeclaredConstructor(int.class, String.class, String.class, int.class);
Student stu2 = (Student) Constructor.newInstance(10, "Tsin", "男", 17);
//print
System.out.println(stu2.getName());