一 Class类
1 Java的反射是指程序在运行期可以拿到一个对象的所有信息
2 反射的出现原因:为了解决在运行期,对一个实例一无所知的情况下,如何调用其方法。
3 反射方法:通过Class的实例获得class的信息
4 获取class的Class实例的方法:
1 直接通过一个class的静态变量class获取
2 通过实例变量提供的getclass()方法
3 知道class完整类名,通过静态方法Class.forame()获取
5 JVM动态加载特性:只有第一次用到一个类时,才将其加载到内存
6 JVM为每个创建的class和interface创建了Class实例来保存class和interface信息
7 通过反射可以直接修改字段的值
8 反射是非常规方法,会破会类的封装
9 invoke()的第一个参数是对象实例,第二个可变参数要与方法参数一致
如果获取的是静态方法,invoke()的第一个参数永远为null
10 多态
使用反射调用方法时,仍然遵循多态原则,总是调用实际类型的复写方法
二 调用构造方法
1 用反射来创建实例,通常使用Class提供的newInstance()方法,(此方法只能调用该类的public无参数构造方法)
Person p = person.class.newInstance()
三 获取继承关系
1 Class getSuperclass():获取父类类型;
Class[] getInterfaces():获取当前类实现的所有接口。
四 动态代理
1 class可以实例化,interface()不能实例化,interface的变量总是通过向上转型并指向某个实例的。
2 动态代理:在运行期动态创建某个interface的实例。
3 静态写法:先定义接口,再编写实现类,最后创建实例,转型为接口并调用。
4 动态代码:先定义接口,直接通过Proxy.newProxyInstance()创建一个接口对象