一、概述
1.反射概述:解剖class对象的一个技术
2.问题:能解剖class对象的啥呢?
a.解剖出成员变量 : 赋值
b.解剖出成员方法: 调用
c.解剖出构造方法: new对象
3.用反射的好处:让代码变的更通用,更灵活
4.问题:反射最开始的一步是干啥?
获取Class对象
5.class对象:class文件对应的对象
class类:描述class对象的类叫做class类
二、获取Class对象
1.方式1:调用Object中的getClass方法:
Class <?> getClass() 开发中最常用,因为方便
2.方式2:不管是基本类型还是引用类型,jvm都为其提供了一个静态成员:class
3.方式3:Class类中的静态方法:
static Class<?> forName(String className)
className:传递的是类的全限定名(包名.类名) 最通用
三、获取Class对象中的构造方法
1.Class类中的方法:
Constructor<?>[] getConstructors() -> 获取所有public的构造
2.Class类中的方法:
Constructor<T> getConstructor(Class<?>... parameterTypes)->获取指定的public的构造
parameterTypes:可变参数,可以传递0个或者多个参数
a.如果获取的是空参构造:参数不用写
b.如果获取的是有参构造:参数写参数类型的class对象
3.Constructor类中的方法:
T newInstance(Object...initargs) -> 创建对象
initargs:传递的是构造方法的实参
a.如果根据无参构造new对象,initargs不写了
b.如果根据有参构造new对象,initargs传递实参
四、利用空参构造创建对象的快捷方式_public
Class类中的方法:
T newInstance() -> 根据空参构造创建对象
前提:被反射的类中必须有public的空参构造
五、利用反射获取有参构造并创建对象_public
1.Class类中的方法: Constructor<T> getConstructor(Class<?>... parameterTypes)->获取指定的public的构造 parameterTypes:可变参数,可以传递0个或者多个参数 a.如果获取的是空参构造:参数不用写 b.如果获取的是有参构造:参数写参数类型的class对象 2.Constructor类中的方法: T newInstance(Object...initargs) -> 创建对象 initargs:传递的是构造方法的实参 a.如果根据无参构造new对象,initargs不写了 b.如果根据有参构造new对象,initargs传递实参
六、利用反射获取私有构造(暴力反射)
1.Constructor<?>[] getDeclaredConstructors()获取所有构造方法,包括private
2.Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) -> 获取指定构造,包括private
parameterTypes:参数类型的class对象
3.Constructor有一个父类叫做AccessibleObject ,里面有一个方法
void setAccessible(boolean flag) -> 修改访问权限
flag为true:解除私有权限