反射机制
Java反射机制
什么是反射
java的反射机制就是在java程序运行中,可以获得任何一个类的所有属性和方法。对于任意一个对象,可以调用其成员和方法。这种动态获取类信息和调用属性和方法的机制叫做java的反射机制。
可以解耦,提高程序可扩充性
反射框架提供的功能
运行时而非编译时:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
- 在运行时调用任意一个对象的方法
将类的各个部分封装为其他对象;框架就是半成品软件,可以在框架的基础上进行软件开发,简化代码;
基础
Class类
- Class类的对象内容是你创建的类的类型信息
- Class类的对象不能像普通类一样,以new的方式创建,它的对象只能由JVM创建,因为这个类没有public构造函数
Class类对象的获取
- Class类的forName函数(静态方法)——将字节码加载到内存,返回class对象,源代码阶段;多用于配置文件,将类名定义在配置文件中.
- 对象的getClass函数——类加载器加载为class类对象阶段;
多用于参数的传递 - 类字面常量.class——运行阶段,类都封装在object类中;
多用于对象的获取字节码
判断是否为某个类的实例
- instanceof关键字
- Class对象的
isInstance()
Object类
其他所有类的父类,没有属性,只有13个方法,其中有9个方法是所有子类继承的。
子类 继承的方法
- clone——保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
- getClass——final方法,获得运行时类型。
- toString
- finalize——用于释放资源
- equals
- notify——该方法唤醒在该对象上等待的某个线程
- hashCode
- wait
- notifyAll——该方法唤醒在该对象上等待的所有线程
finalize()
当垃圾回收期确定不存在该对象的更多引用时,由对象的 垃圾回收器调用此方法
反射应用场景
生成对象
1.Class对象的newInstance()
方法。调用的类必须有无参的构造器!
Class<?> c = String.class;
Object str = c.newInstance();
其中Class<?>代表任何类的一个类对象,使用这个类对象可以为其他类进行实例化。
2.先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()
方法来创建实例。
Class<?> c = String.class;
Constructor constructor = c.getConstructor(String.class);
Object obj = constructor.newInstance("23333");
获取某个Class对象的方法集合
getDeclaredMethods()
方法——返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法getMethods()
方法——返回某个类的所有公用(public)方法,包括其继承类的公用方法getMethod()
方法——public Method getMethod(String name, Class<?>… parameterTypes)——返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。
获取构造器信息
通过Class类的getConstructor方法得到Constructor类的一个实例!
constructor.getModifiers()
——构造方法修饰词public or sthconstructor.getName()
——构造方法名称constructor.getParameterTypes()
——构造方法的参数类型
获取类的成员变量(字段)信息
getFiled
——访问公有的成员变量getDeclaredField
——所有已声明的成员变量。但不能得到其父类的成员变量getFileds
和getDeclaredFields
用法同上
调用方法
从类中获取了一个方法(Method)后,我们就可以用invoke()方法来调用这个方法
创建数组
Array.newInstance(Class<?> componentType, int length)
- Array类为java.lang.reflect.Array类
- 第一个参数是数组元素类型,第二个参数是数组长度