目录
一、概述
反射指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。而这种动态的机制极大的增强了程序的灵活性。在学习中看见一句话总结的很恰当——反射就是把java类中的各种成分映射是一个个的对象。
要获取类的成分首先就需要获取该类的字节码文件对象接下来就从获取Class类对象的方法开始整理知识点,依次介绍反射如何获取构造方法、成员变量、成员方法的方法并通过代码演示来具体实现方法的使用。
二、获取Class类对象的三种方式
1、类名.class属性
//使用类的class属性来获取该类对应的Class对象
Class<Student> c1 = Student.class;
System.out.println(c1);
2、对象名.getClass()方法
//调用对象的getClass()方法,返回该对象所属类对应的Class对象
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
3、Class.forName(全类名)方法
//使用Class类中的静态方法forName(String className)
Class<?> c4 = Class.forName("com.itheima_02.Student");
三、反射获取构造方法
1、方法介绍
Class类获取构造方法对象的方法:
方法名 | 说明 |
---|---|
Constructor<?>[] getConstructors() | 返回所有公共构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
Constructor<T> getConstructor(Class<?>... parameterTypes) | 返回单个公共构造方法对象 |
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) | 返回单个构造方法对象 |
Constructor类用于创建对象的方法:
T newInstance(Object...initargs) | 根据指定的构造方法创建对象 |
2、代码实现
//获取class对象
Class<?> c = Class.forName("Test.Student");
//Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[] cons = c.getConstructors();
//Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor<?>[] cons = c.getDeclaredConstructors();
for(Constructor con : cons) {
System.out.println(con);
}
//Constructor<T> getConstructor(Class<?>... parameterTypes)返回单个公共构造方法对象
Constructor<?> c2 = c.getConstructor(String.class,int.class,String.class);
Object obj = c2.newInstance("张三",15,"cq");
System.out.println(obj);
//Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)返回单个构造方法对象
Constructor<?> con = c.getDeclaredConstructor(String.class);
3、注意事项
当构造方法为私有修饰时需要进行暴力反射(