什么是反射
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
封装后的类,内部属性一定不能被访问吗?
内部私有化的方法一定不能够被外界调用吗?
获取类对象的方式
一切反射相关的代码都从获得类对象开始
1、通过对应类(java.lang.Class)实例的类(Student.class)实例的个体getClass()方法获取
通用增删改的时候用到
Class clz = stu.getClass();
2、通过Class.forName(“类的全路径”);
JDBC的驱动加载就用到反射技术
Class clz = Class.forName("com.li.reflect.Student");//2.
3、类实例.class
做通用查询用到
Class clz = Student.class;//3
System.out.println(clz);
Class c = Student.class;
Class clz = Class.forName(c.getCanonicalName());
System.out.println(clz);
利用反射进行实例化
反射的好处:
能够将未知的类进行实例化
ClassNotFoundException
通过反射的方式调用无参构造器来实例化对象
Object stu = clz.newInstance();//建造实例
通过反射的方式调用带有一个参数的构造器来实例化对象 Class Constructor描述了所以构造器方法
Constructor c = clz.getConstructor(String.class);
Student stu = (Student) c.newInstance("s001");
通过反射的方式调用带有一个参数的构造器来实例化对象
Constructor c = clz.getConstructor(String.class,String.class);
Student stu = (Student) c.newInstance("s001","zs");
通过反射的方式调用私有的构造器来实例化对象 Class
// getConstructor与getDeclaredConstructor
// getConstructor获取到的是public修饰的
// getDeclaredConstructor 获取的所有得构造器
Constructor c = clz.getDeclaredConstructor(Integer.class);
c.setAccessible(true);//
Student stu = (Student) c.newInstance(23);
web.xml是如何使用反射的
动态方法调用
反射读写属性
反射能够访问私有化的属性和方法