当前位置: 首页 > article >正文

Java程序设计基础 第十七章:反射和设计模式

一、反射

1. 相关概念

(1) 类的对象:基于定义好的一个类,创建该类的实例,即利用 new 创建的实例就为类的对象。

(2) 类对象:类加载的产物,封装了一个类的所有信息(包名、类名、父类、接口、属性、方法、构造方法)。

(3) 反射:通过反射可以获取一个类的 类对象,从而获取该类的信息,直接通过类对象进行一系列操作。

4b4cc66b500142c3b73a139705642ddd.jpg

 2. 通过反射技术获取类对象:

(1) 借助 Object类中 getClass()方法,通过 类的对象 获取 类对象:

 Student s = new Student (); // 类的对象

 Class c1 = s.getClass(); // 类对象

(2) 通过 类名.class 直接获取类对象:

 Class c2 = 类名.class;

 例如: Class c2 = Student.class;

(3) 通过 Class 类中静态方法 forName("包名.类名") ;

 Class c3 = Class.forName("test_flect.Student");

 注意:参数需要 包名.类名 ,被称为权限类名、全类名。

 如果只给定了类名,则运行报错,错误信息为:

 java.lang.ClassNotFoundException(类找不到异常)

 补充:类加载的时机。

 (1) 第一次创建该类对象

 (2) 第一次使用该类的静态成员(静态属性和静态方法)

 (3) 子类类加载会导致其父类先进行类加载。

 (4) 通过反射获取类对象,会导致类进行类加载

3. 常用的方法:

(1) getName():获取类名

(2) Method[] getMethods():获取本类+父类中所有公开方法

(3) Method[] getDeclaredMethods():获取自身所有方法,包含非公开的方法。

(4) 通过 类对象 创建 类的对象:

c2fcbc369cd544af8966fa01d1c7493e.jpg

 (5) 通过有参数的构造方法获取类的对象:

019f1f826fc340fd8dd43f3bf99def15.jpg

 (6) 调用某个方法:

c39291a0ad0f4dac8f1a4ad1aa53ad5f.jpg

 4. 反射的优缺点:

(1) 缺点:可读性差,代码繁琐,打破封装。

(2) 优点:可以使代码更加通用和灵活。通常用于底层构,例如:框架等。

二、设计模式(23种)

1. 设计模式:一套被反复使用,多人知晓,并分门别类的编目的一套代码经验总结。

2. 适配器模式详见接口课后题目。

3. 单例设计模式:常见的一种开发设计模式,在Java应用程序中,必须保证JVM内部仅存在该类的一个实例对象。

(1) 第一种实现方式:饿汉式

bc94719f184e40a7a6c9df37d4176eca.jpg

 优点:线程并发效率高

 缺点:空间利用率较低

(2) 第二种实现方式:懒汉式

d4898bbe81c6440aabe154efea19ed83.jpg

 优点:空间利用率较高

 缺点:线程并发效率低

(3) 基于前两种的优缺点,提供第三种方式:

44e5af66470a466bb3173aaf31c56537.jpg

 4. 工厂设计模式:

(1) 工厂设计模式:用于解决程序中对象创建的问题,一个工厂的作用在于完成对象的创建。

(2) 开发时,通常借助反射的技术使工厂通用、灵活。

(3) 扩充Properties:是 Hashtable的子类,即Map的实现类

a. Properties: 键和值,默认为String类型,创建该类对象时,不要添加泛型。

 b. load(InputStream in) / load(Reader in):自动将流指向文件内容进行加载,一行代表一个集合元素,自动以"=" 、":"进行拆分,符号 左侧作为键的内容,右侧作为值的内容

 c. String getProperty(String key):通过键获取对应的值

 


http://www.kler.cn/a/371910.html

相关文章:

  • 利士策分享,赚大钱与赚小钱的哲学,选大还是小?
  • 【vue】Mammoth.js的使用:将.docx和doc 文件转换成HTML
  • 17 Docker容器存储架构:docker存储持久化-bind mount
  • 谷歌云GCP基础概念讲解
  • python爬虫实战案例——抓取B站视频,不同清晰度抓取,实现音视频合并,超详细!(内含完整代码)
  • rocketmq服务的docker启动和配置
  • 大话PM | 从项目管理软件看项目管理的三个原则两个思维两个工具
  • 深入 Prometheus 监控生态 - 第五篇:利用 API 信息进行监控(NAS 备份任务监控 + 解决思路)
  • 【约束优化】一次搞定拉格朗日,对偶问题,弱对偶定理,Slater条件和KKT条件
  • 画思维导图的app有哪些?5个软件让你轻松画思维导图不求人
  • PostgreSQL 不同模式之间的数据迁移
  • Python小游戏18——中国象棋
  • 安卓13 连接usb设备后不更新ui
  • Android 应用权限管理详解
  • 【Linux】线程锁同步互斥生产消费模型
  • Windows: 如何实现CLIPTokenizer.from_pretrained`本地加载`stable-diffusion-2-1-base`
  • 网络爬虫的基本原理是什么?
  • 初始Docker
  • NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力
  • 深入解析 MySQL 数据库:数据类型
  • Rust精简核心笔记:第二波,语法精髓部分解锁
  • 十六:Python学习笔记-- 爬虫(2)requests 模块详解
  • 装饰器怎样实现
  • LeetCode --- 420周赛
  • 大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 3)
  • linux查看系统负载情况