概念:Java反射是可以让我们在运行时获取类的方法,属性,父类,接口等class内部信息的机制。通过反射我们还可以在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值,即使方法或属性是私有的也可以通过反射的形式调用。
使用场景:
(1)编译时我们对于类的内部信息不可知,必须得到运行时才能获取类的具体信息。
(2)要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运行时才存在的类。
获取类的class对象的方式(三种):
(1)类名.class;
(2)对象.getClass();
(3)class.forName("类的全名");
通过Class类型来构造目标类型的对象:
(1)先拿到目标类型class对象。
(2)拿到目标类型的构造方法。
(3)调用Constructor.newInstance()。
Tips:在调用方法之前,Method.setAcessible(true)可以掠过Java语言检查。
反射获取方法:
(1)getDeclaredMethod()和getDeclaredMethods()获取的是自身中定义的函数,从父类中集成的函数不能够获取到。
(2)getMethod()和getMethods()获取的是当前类及其父类的public方法。
反射获取属性:
(1)getDeclaredField()和getDeclaredFields()获取的是在自身中定义的所有属性(public ,protected,private,default),从父类继承的属性不能获的。
(2)getFields()和getField()获取的是自身及其父类中的public属性。
反射获取父类和接口:
反射获取注解信息: