反射允许对成员变量,成员方法、构造方法的信息进行编程访问。
反射 = 获取 + 解剖
- 获取:获取class对象
- 解剖:解剖class对象的一些方法信息
获取class对象的三种方式
- Class.forName(“全类名”):最常用。
- 类名.class:当作参数进行传递
- 对象.getClass():当已经有了这个类的对象时可以使用
@Data @AllArgsConstructor @NoArgsConstructor class Student { private String name; private int age; } public class Demo01 { public static void main(String[] args) throws ClassNotFoundException { Class clazz1 = Class.forName("com.atguigu.reflect.reflect_01_get.Student"); Class clazz2 = Student.class; Student stu = new Student(); Class clazz3 = stu.getClass(); } }
|
利用反射获取构造方法Constructor

获取构造方法
class Stu { private String name; private int age; public Stu() {} public Stu(String name) { this.name = name; } protected Stu(int age) { this.age = age; } private Stu(String name, int age) { this.name = name; this.age = age; } } public class Demo02 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { Class clazz = Class.forName("com.atguigu.reflect.reflect_01_get.Stu"); Constructor[] cons1 = clazz.getConstructors(); Constructor[] cons2 = clazz.getDeclaredConstructors(); Constructor con1 = clazz.getConstructor(); Constructor con2 = clazz.getConstructor(String.class); Constructor con3 = clazz.getDeclaredConstructor(int.class); Constructor con4 = clazz.getDeclaredConstructor(String.class, int.class); System.out.println(con4); } }
|
获取权限修饰符
getDeclaredConstructor()如果获取的是私有的构造方法,正常情况不能用获取的构造方法创建对象,但是使用暴力反射就可以使用私有的构造方法创建对象了
Constructor con = clazz.getDeclaredConstructor(String.class, int.class); con.setAccessible(true); Stu stu = (Stu) con.newInstance("zhangsan", 23);
|
public class Demo03 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { Class clazz = Class.forName("com.atguigu.reflect.reflect_01_get.Stu"); Constructor con = clazz.getDeclaredConstructor(String.class, int.class); con.setAccessible(true); Stu stu = (Stu) con.newInstance("zhangsan", 23); int modifiers = con.getModifiers(); Parameter[] ps = con.getParameters(); } }
|
利用反射获取成员变量Field

获取成员变量
class Stu2 { private String name; private int age; public String gender; } public class Demo04 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException { Class clazz = Class.forName("com.atguigu.reflect.reflect_01_get.Stu2"); Field[] fields1 = clazz.getFields(); Field[] fields2 = clazz.getDeclaredFields(); Field gender = clazz.getField("gender"); Field name = clazz.getDeclaredField("name"); } }
|
获取权限修饰符
public class Demo05 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { Class clazz = Class.forName("com.atguigu.reflect.reflect_01_get.Stu"); Field name = clazz.getDeclaredField("name"); name.setAccessible(true); Stu stu = new Stu(); String value = (String) name.get(stu);
name.set(stu, "linsan");
int modifiers = name.getModifiers();
String n = name.getName();
Class<?> type = name.getType(); } }
|
利用反射获取成员方法Method

获取成员方法
class Stu3 { public void sleep() { System.out.println("睡觉"); } private String eat(String something) { System.out.println("在吃" + something); return something; } private void eat(String something, int a) throws IOException { System.out.println("在吃" + something); } } public class Demo06 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { Class clazz = Class.forName("com.atguigu.reflect.reflect_01_get.Stu3"); Method[] methods1 = clazz.getMethods(); Method[] methods2 = clazz.getDeclaredMethods(); Method sleep = clazz.getMethod("sleep"); Method eat = clazz.getDeclaredMethod("eat", String.class, int.class); } }
|
获取权限修饰符
public class Demo07 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class clazz = Class.forName("com.atguigu.reflect.reflect_01_get.Stu3"); Method eat = clazz.getDeclaredMethod("eat", String.class); int modifiers = eat.getModifiers(); String name = eat.getName(); Parameter[] parameters = eat.getParameters(); Class<?>[] exceptionTypes = eat.getExceptionTypes();
Stu3 stu = new Stu3(); eat.setAccessible(true); String res = (String) eat.invoke(stu, "火锅"); } }
|
反射的作用
- 获取一个类里面所有的信息,获取到之后,再执行其他的业务逻辑
- 结合配置文件,动态的创建对象并调用方法
总结:
- get:获取
- set:设置
- Constructor:构造方法
- Field:成员变量
- Method:方法
- Parameter:参数
- Modifiers:修饰符
- Declared:私有的