java基础-反射机制

一、反射机制概述

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与动态代理举例

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuruhua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值