反射:根据现有对象倒推类的组成
最核心:Class类
任何一个类在JVM中都有唯一的一个class对象,此对象记录该类的组成结构,当类加载时由JVM产生,用户只能取得此对象无法创建
要想在Java中应用反射,首先取得该类的class对象。
三种获取Class对象的方式:
1.调用Object提供的getClass()方法
2.类名称.class
3.调用Class类提供的静态方法Class.forName(类的全名称);
拿到一个类的class对象后的操作:
1.创建该类的新对象
public T newInstance():使用的是类中无参构造进行对象的创建
2.取得包名,父类,父接口信息
Package:描述一个类的包信息
Class类提供的getPackage()方法
取得一个类的父类信息:Class
Class类提供的getSuperClass()方法
取得一个类所有父接口
Class类提供的getInterfaces():Class[]
3.取得构造方法 普通方法,普通属性
Constructor:描述一个类的构造方法
取得指定参数构造方法
Class类提供的getConstructor(参数):只能取得权限为public的构造方法
Clas类提供的getDeclaredConstructor(参数):可以取得类中所有构造方法,与权限无关
取得所有构造方法
Class类提供的getConstructors():只能取得权限为public的构造方法
Class类提供的getDeclaredConstructors():可以取得类中所有的构造方法,与权限无关
创建新对象:
Constructor类提供的
public T newInstance(Object … initargs)
若类中没有无参构造,或者无参构造的权限不是public权限,则只能调用Constructor类提供的newInstance方法使用有参构造来实例化对象
Method:描述一个类的普通方法
反射调用普通方法 Method是一个类
取得类中指定名称与参数的普通方法
public Method getMethod(String name,Class<?>… parameterTypes)
public Method getDeclaredMethod(String name,Class<?> … parameterTypes)
取得类中所有普通方法
public Method[] getMethods() throws SecurityException:取得本类以及父类中所有权限为public的普通方法(包含静态方法)
public Method[] getDeclaredMethods() throws SecurityException
只能取得本类中所有方法(包含private方法)Method[] getDeclaredMethods() 返回 Class 对象表示的类或接口的所有已声明的方法数组,但是不包括从父类继承和接口实现的方法。
Method类提供的反射调用普通方法
public Object invoke(Object obj,Object … args) obj类的实例化对象 args普通方法参数
**Field:**描述一个类的普通属性 Field是一个类
与Method一样
a.取得类中指定名称属性
public Field getField(String name)
public Field getDeclaredField(String name)
b.取得类中所有属性
public Field getFields()throws SecurityException
public Field getDeclaredFields()throws SecurityException
c. Field类提供的设置与取得值方法
/**
*设置属性值
*obj类的实例化对象
*value要设置的值
*/
public void set(Object obj,Object value)
/**
*取得属性值
*obj是类的实例化对象
*/public Object get(Object obj)
/**
*取得属性类型
*/
public Class<?> getType()
动态破坏封装(反射特性)—在一次JVM进程中只能通过反射调用
Constructor、Method、Field类都继承AccessibleObject类,此类中有一个破坏封装的方法
public void setAccessible(boolean flag)throws SecurityException