反射
在程序运行过程中,动态获取一个类中的属性/方法,把这种机制称为反射机制。
在JVM
中,每个类都有一个唯一的class
对象,描述该属性/方法等内容,每个类的class
对象有且只有一个由JVM
产生。 每个类加载到JVM
之后,由JVM
产生这个类的class
对象,程序获取该class
对象的三种方式:
①Class.forName("类的全名称")
②通过类名称.class
③通过该类的任意对象调用getClass
成员方法获取class
对象
反射的四大核心类:
一.Class类:反射的核心类,反射的入口
方法 | 用途 |
---|---|
getClassLoader() | 获得类的加载器 |
getDeclaredClasses() | 返回一个数组,数组中包含该类中所有类和接口类的对象(包括私有的) |
forName(String className) | 根据类名返回类的对象 |
newInstance() | 创建类的实例 |
getName() | 获得类的完整路径名字 |
二.Field类 :代表类的成员变量/类的属性
方法 | 用途 |
---|---|
getField(String name) | 获得某个公有的属性对象 |
getFields() | 获得所有公有的属性对象 |
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredFields() | 获得所有属性对象 |
三.Method类:代表类的方法
方法 | 用途 |
---|---|
getMethod(String name, Class…<?> parameterTypes) | 获得该类某个公有的方法 |
getMethods() | 获得该类所有公有的方法 |
getDeclaredMethod(String name, Class…<?> parameterTypes) | 获得该类某个方法 |
getDeclaredMethods() | 获得该类所有方法 |
四.Constructor类:代表类的构造方法
方法 | 用途 |
---|---|
getConstructor(Class…<?> parameterTypes) | 获得该类中与参数类型匹配的公有构造方法 |
getConstructors() | 获得该类的所有公有构造方法 |
getDeclaredConstructor(Class…<?> parameterTypes) | 获得该类中与参数类型匹配的构造方法 |
getDeclaredConstructors() | 获得该类所有构造方法 |
反射的应用
1.通过反射产生对象
方法1:通过Class
类的newInstance()
方法,此时默认调用Student
类的public
权限的无参构造。
方法2:通过Constructor
类来调用构造方法产生对象。Constructor
类是Java中利用反射操作构造方法的类,getDeclaredConstructors(参数)
:获取该类的所有权限的构造方法,包括私有权限,
获取私有的有参构造:
2.通过反射操作类中的方法
getMethods()
:获取类中所有的公共方法;getDeclaredMethods()
:获取该类的所有方法。
调用普通方法:
调用静态方法:
3.通过反射操作类中的属性:具体方法在Filed类中
总结:
优点: 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;增加程序的灵活性和扩展性,降低耦合性,提高自适应能力。
缺点:
反射会破坏封装性,在当前JVM进程中可见;反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 。
继续努力!!!