概述
在 Java 中,反射(Reflection)是一种强大的机制,允许程序在运行时检查和操作类、接口、字段、方法等的结构。通过反射,程序可以在运行时获取对象的类信息、调用类的方法、访问和修改类的字段等。
使用反射
获得class对象
1.使用 类名.class,可以直接获取一个类的 Class 对象。
1 2
| Class<User> userClass = User.class; System.out.println(userClass);
|

2.使用 对象.getClass(),可以获取某个对象的 Class 对象。
1 2 3
| User user = new User(); Class<? extends User> aClass = user.getClass(); System.out.println(aClass1);
|

3.使用 Class.forName(“类的全限定名”),可以获取一个类的 Class 对象(需要抛异常)。
1 2
| Class<?> user1 = Class.forName("User"); System.out.println(user1);
|

获取构造器 方法、属性
构造函数
获取所有构造函数
1 2 3 4
| Constructor[] declaredConstructors = userClass2.getDeclaredConstructors(); for (Constructor constructor : declaredConstructors) { System.out.println(constructor); }
|
获取公开构造函数
1 2 3 4
| Constructor<?>[] constructors = userClass2.getConstructors(); for (Constructor constructor:constructors){ System.out.println(constructor); }
|
获取无参构造
1 2
| Constructor<User> constructor = userClass2.getConstructor(); System.out.println(constructor);
|
获取有参构造
1 2
| Constructor<User> declaredConstructor = userClass2.getDeclaredConstructor(String.class,Integer.class); System.out.println(declaredConstructor);
|
| 方法名 |
含义 |
getConstructors() |
获取所有 public 的构造方法(包括从父类继承来的) |
getDeclaredConstructors() |
获取这个类自己定义的所有构造方法(不管访问权限) |
getConstructor(Class<?>... parameterTypes) |
获取一个public的构造方法(根据参数类型) |
getDeclaredConstructor(Class<?>... parameterTypes) |
获取这个类中定义的一个构造方法(不管访问权限) |
方法
获取所有方法
1 2 3 4
| Method[] declaredMethods = userClass2.getDeclaredMethods(); for (Method declaredMethod : declaredMethods){ System.out.println(declaredMethod); }
|
获取所有公开方法,包括继承
1 2 3 4
| Method[] methods = userClass2.getMethods(); for (Method method : methods){ System.out.println(method); }
|
根据方法名获得方法
1 2
| Method declaredMethod = userClass2.getDeclaredMethod("pri2", String.class, Integer.class); System.out.println(declaredMethod);
|
根据方法名获得公有方法
1 2
| Method method = userClass2.getMethod("pri1"); System.out.println(method);
|
| 方法名 |
含义 |
getMethods() |
获取所有 public 方法(包括继承来的) |
getDeclaredMethods() |
获取这个类自己定义的所有方法(不管访问权限) |
getMethod(String name, Class<?>... parameterTypes) |
获取一个 public 的方法(根据名字和参数) |
getDeclaredMethod(String name, Class<?>... parameterTypes) |
获取这个类自己定义的某个方法(不管访问权 |
属性
获得所有属性
1 2 3 4
| Field[] declaredFields = userClass2.getDeclaredFields(); for (Field declaredField : declaredFields){ System.out.println(declaredField); }
|
获得所有公有属性
1 2 3 4
| Field[] fields = userClass2.getFields(); for (Field field : fields){ System.out.println(field); }
|
根据属性名获得属性
1 2
| Field declaredField = userClass2.getDeclaredField("email"); System.out.println(declaredField);
|
根据属性名获得公有属性
1 2
| Field field = userClass2.getField("address"); System.out.println(field);
|
| 方法名 |
含义 |
getFields() |
获取所有 public 的字段(包括继承来的) |
getDeclaredFields() |
获取这个类自己定义的所有字段(不管访问权限) |
getField(String name) |
获取一个 public 的字段(根据字段名) |
getDeclaredField(String name) |
获取这个类自己定义的某个字段(不管访问权限 |
创建实例
通过类.newInstance()方法创建对象
创建无参实例
1 2
| Object user3 = userClass3.newInstance(); System.out.println(user3);
|
创建有参实例
1 2 3
| Constructor<User> declaredConstructor1 = userClass3.getDeclaredConstructor(String.class, Integer.class); User user4 = declaredConstructor1.newInstance("xiaowu",21); System.out.println(user4);
|
调用方法和访问字段
调用方法
使用Method.invoke("实例对象名","参数")函数进行调用方法
1,获取类
2,创建对象
3,获取方法
4,调用方法
如果是实例方法必须要创建对象实例,如果是静态方法则不用
1 2 3 4 5 6 7 8
| Constructor<User> declaredConstructor1 = userClass3.getDeclaredConstructor(String.class, Integer.class); User user4 = declaredConstructor1.newInstance("xiaowu",21); System.out.println(user4);
System.out.println("-----调用类中的方法-----"); Method declaredMethod1 = userClass3.getDeclaredMethod("pri2", String.class); declaredMethod1.invoke(user4,"dis");
|
访问字段
使用 Field.get() 和 Field.set() 可以获取和设置字段的值。
设置某个字段的值
1 2 3 4 5 6
| Class c = User.class; Object o = c.getConstructor().newInstance(); Field ageField = c.getDeclaredField("age"); ageField.setAccessible(true); ageField.set(o,20); System.out.println(o);
|
获取某个字段的值
1 2 3 4 5
| Class c = User.class; Object o = c.getConstructor().newInstance(); Field usernameField = c.getDeclaredField("username"); usernameField.setAccessible(true); System.out.println(usernameField.get(o));
|
setAccessible的作用
setAccessible 方法是 Java 反射 API 中的一个重要方法,用于更改反射对象的可访问性标志。它主要用于访问类的私有或受保护的成员(字段、方法、构造器),使得这些成员可以被反射机制访问,即使它们原本的访问权限是不允许的。