Java 反射
反射机制:在程序运行状态中,动态的获取对象的信息和调用对象的方法
反射的功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的实例
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
获取反射的三种方式:
- Class.forName(全类名(包名+类名))
- 类名.class
- 对象.getClass()
Class<?> clazz = Class.forName("com.bean.Student"); clazz.getMethods(); //获取所有的公共的方法 clazz.getInterfaces(); //获取所有的接口 clazz.getSuperclass();//获取所有的父类 clazz.getConstructors();//获取所有的构造函数 //如果要获取私有的 : 加上Declared clazz.getDeclaredMethods();//获取所有的方法 包括私有方法 //通过Class对象获取实例 Student s = (Student) clazz.newInstance(); //获取具体属性 Field nameField = clazz.getField("name"); //操作属性 nameField.set(s, "zxf"); //就相当于 s.setName("zxf"); /* * 如果操作的是私有属性 需要暂时打开访问权限 * nameField.setAccessible(true); 再进行操作 -->对于方法和构造函数也是一样 */ //获取具体方法 Method method1 = clazz.getMethod("showInformation", null); //第二个参数是该方法的参数类型 method1.invoke(s, null); //执行方法 //获取具体构造函数 Constructor constructor = clazz.getConstructor(null); //获取无参构造函数 Student s1 = (Student) constructor.newInstance(null); //通过构造方法获取实例
反射可以越过泛型检查:
List<Integer> list = new ArrayList<Integer>(); list.add(12); list.add(34); Class listClass = list.getClass(); Method addMethod = listClass.getMethod("add", Object.class); ///第二个参数是:所获取的方法的参数类型 addMethod.invoke(list, "1234"); System.out.println(list);
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步