javase-----(13)反射和动态代理

目录

反射和动态代理

【一】java中的反射

1.1 理解class类

1.2 获取class对象的三种方法

1.3 class常用的几张方法

【二】ClassLoader

2.1 介绍

2.2 使用类加载器获取当前类目录下的文件

【三】反射的常用的几种方法(重要后面的spring的原理就是反射和动态代理)

3.1 Class: 是一个类; 一个描述类的类.

【四】java动态代理

4.1 静态代理

4.2 动态代理


反射和动态代理

【一】java中的反射

1.1 理解class类

  • Class 对象只能由系统建立对象
  • 一个类在 JVM 中只会有一个Class实例
  • 每个类的实例都会记得自己是由哪个 Class 实例所生成

 

1.2 获取class对象的三种方法

  • 通过类名获取      类名.class    
  • 通过对象获取      对象名.getClass()
  • 通过全类名获取    Class.forName(全类名)

 

1.3 class常用的几张方法

 

【二】ClassLoader

2.1 介绍

类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:

 

2.2 使用类加载器获取当前类目录下的文件

首先,系统类加载器可以加载当前项目src目录下面的所有类,如果文件也放在src下面,也可以用类加载器来加载调用 getResourceAsStream 获取类路径下的文件对应的输入流.

public class ReflectionTest {

    @Test

    public void testClassLoader() throws FileNotFoundException{

        //src目录下,直接加载

        InputStream in1 = null;

        in1 = this.getClass().getClassLoader().getResourceAsStream("test1.txt");



        //放在内部文件夹,要写全路径

        InputStream in2 = null;

        in2 = this.getClass().getClassLoader().getResourceAsStream("com/atguigu/java/fanshe/test2.txt");

    }

}

【三】反射的常用的几种方法(重要后面的spring的原理就是反射和动态代理)

3.1 Class: 是一个类; 一个描述类的类.

封装了描述方法的 Method,

描述字段的 Filed,

描述构造器的 Constructor 等属性.
 

  • 如何得到 Class 对象:
Person.class
person.getClass()
Class.forName("com.atguigu.javase.Person")

 

  • 关于 Method:
如何获取 Method:
1、getDeclaredMethods: 得到 Method 的数组.
2、getDeclaredMethod(String methondName, Class ... parameterTypes)

如何调用 Method
1、如果方法时 private 修饰的, 需要先调用 Method 的 setAccessible(true), 使其变为可访问
2、method.invoke(obj, Object ... args);

 

  • 关于 Field:
如何获取 
Field: getField(String fieldName)

如何获取 Field 的值: 
setAccessible(true)
field.get(Object obj)

如何设置 Field 的值:
field.set(Obejct obj, Object val)
  
了解 Constructor 和 Annotation 
  

 

  •   反射和泛型.
getGenericSuperClass: 获取带泛型参数的父类, 返回值为: BaseDao<Employee, String>
Type 的子接口: ParameterizedType
可以调用 ParameterizedType 的 Type[] getActualTypeArguments() 获取泛型参数的数组.

 

【四】java动态代理

4.1 静态代理

  • 写接口

  • 实现类

  • 代理类

  • 运行

 

4.2 动态代理

  • 接口

  • 实现类

  • 写实现InvocationHandler中有一个invoke方法,所有执行代理对象的方法都会被替换成执行invoke方法。

  • 运行

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值