反射
摘自:https://www.liaoxuefeng.com/wiki/1252599548343744/1264804593397984
Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息
反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法
Class类
除了int等基本类型外,java的其他类型全部都是class(包括interface),如String、Object、Runnable、Exception
class(包括interface)的本质是数据类型(Type),无继承关系的数据类型无法赋值
动态加载
JVM在执行Java程序的时候,并不是一次性把所有用到的class全部加载到内存,而是第一次需要用到class时才加载
如果没有用到某个方法,那么这个方法对应的class文件根本就不会被加载,这就是JVM动态加载class的特性
动态加载class的特性对于Java程序非常重要。利用JVM动态加载class的特性,我们才能在运行期根据条件加载不同的实现类
JVM为每个加载的class
及interface
创建了对应的Class
实例来保存class
及interface
的所有信息;
获取一个class
对应的Class
实例后,就可以获取该class
的所有信息;
通过Class实例获取class
信息的方法称为反射(Reflection);
JVM总是动态加载class
,可以在运行期根据条件来控制加载class。
获取继承关系
动态代理
有没有可能不编写实现类,直接在运行期创建某个interface
的实例呢?
这是可能的,因为Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface
的实例。
动态代码,我们仍然先定义了接口Hello
,但是我们并不去编写实现类,而是直接通过JDK提供的一个Proxy.newProxyInstance()
创建了一个Hello
接口对象。这种没有实现类但是在运行期动态创建了一个接口对象的方式,我们称为动态代码。JDK提供的动态创建接口对象的方式,就叫动态代理。