反射的本质是JVM得到了class对象之后,对class对象进行反编译从而获取到对象的各类信息,当然,这里的反编译并不是真的反编译,因为class对象本身就包含了所有的类信息,不需要反编译,这里是指运行时,通过class对象去动态地获取类相关地信息。
反射的优点:
1、提高程序的灵活性。反射可以让我们在程序运行期间获取关于对象与类的信息,还能改变对象与类的行为,比如一个private的字段,通常情况我们无法获取,但是通过反射可以获取。
2、降低耦合性,提升复用率。我们在运行的时候不必明确指定具体的类,可以让我们在程序运行时再确定,比如动态代理。
反射的缺点:
1、性能不如直接调用。反射犹豫需要动态加载类,获取类的各类信息,安全检查等额外开销,并且相对于直接调用中编译器做了很多的优化,反射是没有的,因此导致反射的性能不如直接调用。
2、反射的代码可读性下降。反射的动态性会妨碍阅读代码,并且在异常处理方法需要用更多方式去处理;反射代码缺乏类型检查,是否发生类型问题只有到了运行时才能发现。
3、反射可以绕过final这类限制访问的属性或者方法,可能破坏代码本身的抽象性。