第一问:什么是Java反射?
答:顾名思义,反射就相当于一面镜子,对着镜子我们可以整理衣冠等。Java反射机制同样,它是可以动态的访问,检测和修改本身的一种能力。
第二问:那么它的基本工作流程是什么?
它的工作流程主要有以下几步:
一、获取到类的Class对象,获取方式一:通过Class.forName(className)来获取;获取方式二:通过ClassName.getClass()获取;获取方式三:通过new ClassName().getClass()的方式来获取。
二、获取到类的构造(Constructor)对象:获取构造对象的目的是为了后续创建类的实例对象,当然,也可以直接通过Class.newInstance()来获取,这样获取的方式默认是无参构造创建的类实例对象,但是前提是类中没有其他的有参构造器,若有的话,该方法就行不通了。
三、获取到类的实例对象(也就是类的反射对象),获取的方法是通过Constructor对象的newInstance()方法来获取或者是Class.newInstance()来获取。
四、接着就是对属性、方法的访问和调用。使用Class对象的getMethod()方法或getDeclaredMethod()即可访问到类的方法,拿到Method对象后,通过Method对象的invoke()方法就可以实现对类方法的调用,invoke()方法有两个参数,一个是类所属对象(Class Object),第二个是方法的参数(args...)。使用getField()方法就能访问到类的对应属性字段,前提是要注意类的方法和属性的访问权限限制,也就是修饰符,关于修饰符这里不做赘述。
五、动态代理:通过
Proxy
类可以创建代理对象,代理对象可以拦截方法的调用并添加额外的逻辑。
六、修改访问权限:通过
AccessibleObject
类的setAccessible()
方法可以绕过Java的访问控制,允许访问私有方法、字段和构造方法。其实这步不是必须的,在开发中按照自己的需求来。
最后,Java反射固然好用,但毕竟是在运行时,也就是内存中操作,对性能有一定的影响,所以对性能有要求的,应尽量少使用反射来实现业务。