1. 反射机制的概念
- 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
- 对于任意一个对象,都能够调用它的任意属性和方法
- 利用反射调用类中的属性和方法时,无视修饰符
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
2. 反射机制的应用
使用反射首先需要获取Class类对象(三种方式)
- 类名.class
- 对象名.getClass()
- Class.forName(全类名)
2.1 反射获取构造方法并使用
获取构造方法对象的方法有很多,详情参考官方文档
-
获取指定的公共构造方法
//获取Class对象 Class aClass = Class.forName("cn.yulufox.pojo.User"); //获取无参构造方法对象 Constructor cons1 = aClass.getConstructor(); //获取有参构造,方法参数需要与构造方法的形参保持一致 Constructor cons2 = aClass.getConstructor(Long.class, String.class, String.class);
-
获取指定的私有构造方法
//获取Class对象 Class aClass = Class.forName("cn.yulufox.pojo.User"); //获取无参私有构造方法对象 Constructor constructor = aClass.getDeclaredConstructor();
使用Constructor类创建对象
-
使用公共构造方法创建对象
//获取Class对象 Class aClass = Class.forName("cn.yulufox.pojo.User"); //获取无参构造方法对象 Constructor constructor = aClass.getConstructor(); //创建对象,向下转型 User user = (User) constructor.newInstance();
-
使用私有构造方法创建对象
//获取Class对象 Class aClass = Class.forName("cn.yulufox.pojo.User"); //获取无参私有构造方法对象 Constructor constructor = aClass.getDeclaredConstructor(); //被private修饰的成员,不能直接使用的 //如果用反射强行获取并使用,需要临时取消访问检查 constructor.setAccessible(true); //创建对象,向下转型 User user = (User) constructor.newInstance();
2.2 反射获取成员变量并使用
Class aClass = Class.forName("cn.yulufox.pojo.User");
Constructor constructor = aClass.getConstructor();
User user = (User) constructor.newInstance();
//获取私有成员变量 mobile
Field mobile = aClass.getDeclaredField("mobile");
//取消一下访问检查
mobile.setAccessible(true);
//给指定对象的mobile属性赋值
mobile.set(user,"12345678900");
//获取指定对象的mobile值
Object o = mobile.get(user);
2.3 反射获取成员方法并使用
//获取类对象
Class aClass = Class.forName("cn.yulufox.pojo.User");
//获取成员方法对象
Method showAndReturn = aClass.getDeclaredMethod("showAndReturn", String.class);
//获取方法的调用者,简写方式
User user = (User) aClass.newInstance();
//运行方法,接收返回值
Object poem = showAndReturn.invoke(user, "争渡!争渡!惊起一滩鸥鹭!");
//打印返回值
System.out.println(poem);