Java 中的反射是什么意思?
什么是Java反射?
官方给出的解释:Java的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法; 并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。
简单的说:在运行时动态地获取、操作和修改类或对象的属性、方法、构造函数等信息的能力,而不需要在编译时预先知道类的具体信息。
![](https://www.tulingxueyuan.cn/d/file/p/2023/11-28/7132016538814df2365eb0909091d4fe.png)
如何利用反射机制获取class对象?
![](https://www.tulingxueyuan.cn/d/file/p/2023/11-28/efd258563e1179e041d5fb85857ffa46.png)
- 使用 Class.forName 静态方法
在使用Class.forName获取Class对象时,需要提供完整的类名(包括包名)。如果User类不在默认包中,还需要加上包名,如Class.forName("polo.User")。
- 使用类名.class 方法
@Test
public void classDemo1() {
// 使用类的.class获取Class对象
Class<?> userClass = User.class;
System.out.println(userClass);
}
- 使用实例对象的 getClass() 方法
@Test
public void classDemo1() throws ClassNotFoundException {
// 使用实例获取Class对象
User user = new User();
Class<?> userClass = user.getClass();
}
利用反射创造对象
![](https://www.tulingxueyuan.cn/d/file/p/2023/11-28/9e76f305913ead299c8611b223495ef6.png)
//方式一
Class class = Class.forName("polo.User");
User user = (User) class.newInstance();
System.out.println(user);
//方式二
Constructor constructor = class.getConstructor();
User user1 = (User) constructor.newInstance();
System.out.println(user1);
利用反射获取方法
![](https://www.tulingxueyuan.cn/d/file/p/2023/11-28/524d7baa937ab8783eb9063de2582f84.png)
//方法一
Class class1 = Class.forName("polo.User");
Method[] declaredMethods = class1.getMethods();
System.out.println(Arrays.tostring(declaredMethods));
利用反射成员变量
![](https://www.tulingxueyuan.cn/d/file/p/2023/11-28/781ea2d61f59d76addc5a4af1e09c757.png)
Class class1 = Class.forName("polo.User");
Field email = class1.getDeclaredField("email");
System.out.println(email);
Field username = class1.getDeclaredField("username");
System.out.println(username);
利用反射获取类构造器
![](https://www.tulingxueyuan.cn/d/file/p/2023/11-28/16858a553802c0eefa71a4b462efe2bf.png)
Class class1 = Class.forName("polo.User");
//Class<?>[] parameterTypes = null; //调用无参构造器,也可以直接不传任何参数
Class<?>[] parameterTypes = {int.class, String.class, String.class}
Constructor<? extends User> constructor1 = Class.getConstructor(parameterTypes);
System.out.println(constructor1);
//constructor1.newInstance();
constructor1.newInstance(1,"baili","baili.com");
![](/images/780-200-2.jpg)