一、反射机制概述
1、反射之前,类的实例化等操作
2、使用反射实现上述操作
通过反射,可以调用Person类的私有结构的.比如:私有的构造器、方法、属性
3、如何看待反射和封装性两个技术
建议直接使用new的方式;什么时候使用反射:反射的特征:动态性,具有动态性特征的场景下使用反射
反射和封装不矛盾,
二、Class类的理解 java.lang.Class
1、类加载过程:程序经过javac.exe命令以后,会生成一个或者多个字节码文件(.class结尾),接着使用java.exe命令对某个字节码文件进行解释运行,相当于将某个字节码文件加载到内存中,此过程就称为类的加载.加载到内存中的内,称为运行时类,此运行时类,就作为Class的一个实例.换句话说,Class的实例就对应着一个运行时类;加载到内存中的运行时类,会缓存一定的时间,再此时间之内,我们可以通过不同的方式来获取此运行时类.
2、获取Class实例的4种方式
(1)调用运行时类的属性.class
(2)通过运行时类的对象
(3)调用Class的静态方法:forName(String classpath即完整路径)
前三种当时需要掌握
(4)使用类的加载器:ClassLoader。 测试类.class.ClassLoader()
3、Class实例对应的结构的说明
4、理解类的加载过程
ClassLoader的理解:
eg:
有,为null则说明string时引导类加载器
5、使用ClassLoader加载配置文件
使用ClassLoad,出现空指针异常
原因:配置文件默认识别为当前module的src下,因为jdbc.properties文件没有在src下,将该文件改到src下即可
6、通过反射,创建对应的运行时类的对象 (对应哪个class,就只能创建哪个类的运行时类的对象)
(1)newInstance():调用此方法,创建对应的运行时类的对象.内部调用了运行时类的空参的构造器
要想此方法正常的创建运行时类的对象,要求:
a、运行时类必须提供空参的构造器
b、空参的构造器的访问权限得够.通常设置为public
在javabean中要求提供一个public的空参的构造器,原因:
a、便于通过反射,创建运行时类的对象
b、便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器
(2)举例体会反射的动态性:
(3)获取运行时类的属性结构及其内部结构
获取属性结构
a、getFields():获取当前运行时类及其父类中声明为public访问权限的属性
b、 getDeclaredFields():获取当前运行时类中声明的所有属性.(不包含父类中声明的属性)
c、获取权限修饰符 数据类型 变量名
getModifiers():获取权限修饰符
getType():获取数据类型
getname():获取变量名
(4)获取运行时类的方法结构
a、getMethods():获取当前运行时类及其所有父类中声明为public权限的方法
b、getDeclaredMethods():获取当前运行时类中声明的所有方法,不包含父类中声明的
(5)获取运行时类的方法的内部结构
@xxxx
权限修饰符 返回值类型 方法名(参数类型1 形参1,...) throws xxxException{}
a、获取方法声明的注解:getAnnotations()
b、获取权限修饰符:getModifiers()
c、获取返回值类型:getReturnType()
d、获取方法名:getName()
e、获取形参列表:getParameterType()
f、抛出的异常
(6) 获取运行时类的构造器结构
getConstractors():当前运行时类中声明为public的构造器
getDeclaredConstractors():获取当前运行时类中声明的所有构造器
(7)获取运行时类的父类及父类的泛型
a、getSuperclass():获取运行时类的父类
b、 getGenericSuperclass():获取运行时类带泛型的父类
b、获取运行时类父类的泛型
(8)获取运行时类的接口、所在包,注解等
a、获取运行时类的接口:getinterface()
b、获取运行时类所在的包:getPackage()
c、获取运行时类的注解:getAnnotations()
(9)重点:调用运行时类的指定结构:属性、方法、构造器
a、调用属性:
方式一:要求运行时类中的属性声明为public
通常不采用此方式
方式二、如何操作运行时类中的指定属性:
a、getDeclaredField(String fieldName):获取运行时类中指定变量名的属性;b、保证当前属性是可访问的;c、获取、设置指定对象的此属性值
报错:访问权限报错,
解决方式:修改之前增加权限
(10)重点:如何操作运行时类中指定的方法
(10.1)
a、获取指定的某个方法;getDeclaredMethod();参数一:指明获取方法的名称;参数二:指明获取的方法的形参列表
b、保证当前方式可访问的
c、invoke();参数一:方法的调用者;参数二:给方法形参赋值的实参
invoke()的返回值即为对应类中调用的方法的返回值
(10.2)如何调用静态方法:
也可以为空,但是必须有参数:
(11)如何调用运行时类中指定的构造器:这个用的少,一般直接用newinstance()来构造,指定构造器不通用,了解即可
步骤:
a、获取指定的构造器 :getDeclaredConstractor();参数指明构造器的参数列表
b、保证此构造器是可访问的
c、调用吃构造器创建运行时类的对象
4、反射的应用
(1)代理模式:
(2)静态代理的例子
特点:代理类和被代理类编译期间就确定下来了
(3)动态代理例子:
(4) AOP与动态代理举例