运行过程中,对任意一个类都能获取类中的属性和方法,对任意一个对象都能调用对象中的属性和方法,动态获取信息及调用对象的方法,实现功能的反射机制
作用:动态获取类的信息
相关类主要包括:Class 类型; Constructor 构造方法; Method 方法; Field 属性,Class外的其他三个都在java.lang.reflect包中
一旦class文件被加载到内存,就会创建一个Class对象,Class类是反射机制的基础,通过Class类可以得到类的基础信息.
获取的三种方法:
1.Object中的getClass方法:适用于知道对象获取
2.类名.class方法:适用于通过类名获得
3.通过Class.forName("类的地址")获取Class对象
Constructor<泛型数据> constructor ="Class对象".getConstructor("参数类型.class,没有可以不写");
可以通过getxxx方法获得构造方法的基本信息,例如:getName(返回构造方法的名字),getId(返回构造方法中的id)等
还可以通过newInstance创建实例
constructor.newInstance(参数数据);
public Field getField(String name)通过指定Field名字,返回 Field实例
获得类中属性
getField("name")获得指定名称的公共权限的属性名
getDeclaredField("name")获得指定名称的所有私有权限的属性名
getFields获得公共权限的属性名
getDeclaredFields获得所有私有权限的的属性名
Method getMethod(String name, Class... parameterTypes) : 通过指定方法名,参数类型,返回一个Method实例
获得类中的方法
x.getMethods()获得类中所有的公共的成员方法
x.getMethod("getId",type) 获得公共的指定名称参数的成员方法
x.getDeclaredMethods();得类中所有的成员方法(包含私有的)
x.getDeclaredMethod("name",type)得公共的指定名称参数的类中所有的成员方法
x.invoke(y)实现在y里的x方法
● 1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作
● 2.提高代码的复用率,比如动态代理
● 3.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态 调用
● 1.反射会涉及到动态类型的解析,导致性能要比非反射调用更低
● 2.使用反射技术通常要在一个没有安全限制的程序运行.
● 3.反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象 性