什么是反射
- Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
通俗易懂的说,反射就是能把类里的任何属性方法,单个或多个拿出来
简而言之,指在 Java 程序运行时
给定的一个类(Class)对象,通过反射获取这个类(Class)对象的所有成员结构。
给定的一个具体的对象,能够动态地调用它的方法及对任意属性值进行获取和赋值。
这种动态获取类的内容,创建对象、以及动态调用对象的方法及操作属性的机制为反射。即使该对象的类型在编译期间是未知,该类的 .class 文件不存在,也可以通过反射直接创建对象。
优势
增加程序的灵活性,避免将固有的逻辑程序写死到代码里
代码简洁,可读性强,可提高代码的复用率
劣势
相较直接调用,在量大的情景下反射性能下降
存在一些内部暴露和安全隐患
Class.forName(“类的全路径”);
类名.class
对象.getClass();
Class<Boy> clazz = Boy.class; // 通过类的 class 属性
Class<?> clazz2 = new Boy().getClass(); // 通过运行时类对象的 getClass 方法获取
Class<?> clazz3 = Class.forName("com.hncboy.corejava.reflection.Boy"); // 通过类的全限定名获取
Class<?> clazz4 = Main.class.getClassLoader().loadClass("com.hncboy.corejava.reflection.Boy"); // 通过类加载器获取
拿到对象的构造方法
获取Class对象的构造方法
Constructor<?>[] getConstructors()
Constructor getConstructor(类<?>… parameterTypes)
Constructor getDeclaredConstructor(类<?>… parameterTypes)
Constructor<?>[] getDeclaredConstructors()
拿到对象的成员方法
Method[] getMethods()
Method getMethod(String name, 类<?>… parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 类<?>… parameterTypes)
拿到对象的成员变量
获取Class对象的成员变量
Field[] getFields() :获取所有public修饰的成员变量
Field getField(String name) 获取指定名称的 public修饰的成员变量
Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name)
反射的用途
反射最大的用途就是框架,比如:Spring中的Di/IoC、Hibernate中的find(Class clazz)、Jdbc中的classForName()、SpringBoot的Service注解等,很多开发框架都用到了反射机制
反射还有一个不得不说的问题,就是性能问题,大量使用反射会导致系统性能大打折扣,反射固然强大,但是其性能比较差
反射能“暴力“地获取类的所有方法(甚至是私有的),所以可能会带来一些安全问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)