Java 中的反射是什么意思?
什么是Java反射?
官方给出的解释:Java的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法; 并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。
简单的说:在运行时动态地获取、操作和修改类或对象的属性、方法、构造函数等信息的能力,而不需要在编译时预先知道类的具体信息。
如何利用反射机制获取class对象?
- 使用 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();
}
利用反射创造对象
//方式一
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);
利用反射获取方法
//方法一
Class class1 = Class.forName("polo.User");
Method[] declaredMethods = class1.getMethods();
System.out.println(Arrays.tostring(declaredMethods));
利用反射成员变量
Class class1 = Class.forName("polo.User");
Field email = class1.getDeclaredField("email");
System.out.println(email);
Field username = class1.getDeclaredField("username");
System.out.println(username);
利用反射获取类构造器
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");