反射:指在运行时去获取一个类的变量和方法信息,然后通过获取到的信息来创建对象,调用方法的一种机制,由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译器就完成确定,在运行期仍然可以扩展。
简而言之就是:反射通过拿到类的构造方法来创建对象
获取class类的对象:我们要想通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为class类型的对象
三种方法获取class类型的对象:
- 使用类的class属性来获取该类对应的class对象,比如:student.class将会返回student类对应的class对象
//使用类的class属性来获取该类对应的class对象
Class<Student> c1 = Student.class;
System.out.print(c1);
Class<Student> c2 = Student.class;
System.out.print(c1 == c2);
- 调用对象的getClass()方法,返回该对象所属类对应的class对象,该方法是object类中的方法,所有的java对象都可以调用该方法
//调用对象的getClass()方法,返回该对象所属类对应的class对象,该方法是object类中的方法,所有的java对象都可以调用该方法
Student s =new Student();
Class<?extends Student > c3 = s.getClass();
System.out.print(c1 == c3);
- 使用class类中的静态方法forName(string classname),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径
Class类中用于获取构造方法的方法
1. Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
2. Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组
3. Constructor<T> getConstructor(Class<?>... parameterTypes) :返回单个公共构造方法对象
4. Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) :返回单个构造方法对象
Constructor类中用于创建对象的方法
1. T newInstance():根据指定的构造方法创建对象
小练习:通过反射实现
Student s= new Student("小丁","40","西安");
System.out.print(s);
public static void main(String[] args)throws ClassNotFoundException,NoSuchMethodException,InstantiationException,InvocationTargetException,IllegalAccessException {
//获取Class对象
Class<?> c = Class.forName("Student");
//基本数据类型也可以通过.class得到对应的class类型
// public Student(String name,int age,String address)
Cons