第十七章:反射+设计模式

一、反射

 1. 反射(Reflection):允许在程序运行状态中,可以获取任意类中的属性和方法,并且可以操作任意对象内部的属 性和方法,这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。

 2. 类对象 和 类的对象(实例)

    (1) 类的对象:基于某个类 new 出来的对象,也称为实例对象。

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

 3. 获取类对象:通过反射机制

    (1) 第一种方式:通过类的对象 获取 类对象      

          Student s = new Student(); // 实例      

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

          System.out.println(c1);

    (2) 第二种方式:类名.class      

          Class c2 = Student.class;      

          System.out.println(c2);      

          System.out.println(c1 == c2);

    (3) 第三种方式:通过 静态方法 forName("包名.类名");      

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

          System.out.println(c3);

 4. 通过反射技术,操作类对象的信息

     Class c = Class.forName("testflect.Student");      

          // 通过 反射技术操作类对象信息      

          System.out.println(c.getName()); // 获取类名       

          System.out.println(c.getSuperclass().getName());//获取父类类名      

          System.out.println(c.getPackage().getName()); //获取包名    

          Class[] iters=c.getInterfaces();// 获取 实现的接口      

          System.out.println("Student实现的接口数量:"+iters.length);      

          for(Class inter:iters){          

               System.out.println(inter.getName());      

          }      

          Method[] ms=c.getMethods(); // 获取本类+父类中公开方法      

          System.out.println("Student类中定义方法的个数为:"+ms.length);      

          for(Method m:ms){

               System.out.println(m.getName());      

          }      

          System.out.println("--------");      

          Method[] mds = c.getDeclaredMethods();// 获取 自定的方法,包含非公开      

          for(Method m:mds){          

               System.out.println(m.getName());      

          }      

          System.out.println("---------");      

          Field[] fs=c.getDeclaredFields(); // 获取 自定义的属性,包含非公开      

          for(Field f:fs){          

               System.out.println(f.getName());      

          }

     // 通过反射的技术获取 类的对象-》实例      

          Class c = Class.forName("testflect.Student");      

          Object o=c.newInstance();// 默认 采用 无参数的构造方法      

          Student s = (Student)o;      

          s.setName("魏语石");      

          System.out.println(o);      

          // 利用 有参数的构造方法,借助 反射技术获取对象      

          Constructor cs=c.getConstructor(String.class,Integer.class,Double.class);      

          Object obj2=cs.newInstance("宋兵兵",23,99.0);      

          System.out.println(obj2);      

          // 反射 操作私有化 内容      

          Method m=c.getDeclaredMethod("test");// 第一个参数代表方法名, 第二参数:代表参数类型

          m.setAccessible(true);      

          m.invoke(c.newInstance());

 5. 反射的优缺点:

    (1) 优点:使用反射设计程序,让程序更加灵活和通过,通常应用在框架底层设计

    (2) 缺点:利用反射设计程序,让程序更加复杂

二、设计模式

 1. 设计模式:是一套被反复使用、多数人知晓、经过分类编目的代码经验总结。

 2. 单例模式:

    (1) 单例模式(Singleton):保证在当前JVM中,该类只有一个实例(对象)存在,是一种常见的设计模式。

    (2) 单例模式的实现方式:  

          // 代码实现单例的第一种方式:饿汉式  

          class ClassA{      

               private static final ClassA ca = new ClassA();      

               private ClassA(){}      

               public static ClassA getClassA(){          

                    return ca;

               }  

          }  

          // 代码实现单例的第二种方式:懒汉式  

          class ClassB{      

               private static ClassB cb;      

               private ClassB(){}      

               public synchronized static ClassB getClassB(){          

                    if(cb == null){              

                         cb = new ClassB();          

                    }          

                    return cb;      

                }      

               public static void test(){}  

          }      

          饿汉式:      

               优点:线程并发效率较高      

               缺点:内存空间利用率低  

          懒汉式:      

               优点:内存空间利用率高      

               缺点:线程并发效率较低

 2. 工厂设计模式

    (1) 工厂设计模式:主要解决的是对象创建的问题,工厂的职责在于创建一个对象

    (2) 注意:工厂设计模式通常会利用反射技术,使工厂更加的灵活和通用。

     public class TestFactory {  

          public static void main(String[] args) {      

               Object obj = MyObjectFactory.getObject("testflect.Student");      

               System.out.println(obj);  

          } 

      }

     // 工厂:解决对象创建问题

     class MyObjectFactory{  

          public static Object getObject(String className){      

               try {          

                    // 获取类对象          

                    Class c = Class.forName(className);          

                    // 类对象 获取 实例          

                    Object obj = c.newInstance();          

                    return obj;      

               }catch (Exception e){          

                    e.printStackTrace();          

                    return null;      

               }  

          }

     }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492695.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】结构化命令:for命令

1、基本介绍 for循环假定各个值之间是以空格、制表符或换行符分隔的,因为特殊的环境变量IFS(internal field separator,内部字段分隔符),默认情况下,它会将这三者视为字段分隔符。 格式: for v…

Nginx(Linux之Ubuntu)

1.1.什么是Nginx Nginx(发音为"engine x")是由俄罗斯开发者Igor Sysoev创建的一款轻量级、高性能的Web服务器。它首次发布于2004年,如今已成为全球最受欢迎的Web服务器之一。Nginx以其卓越的性能和灵活性而闻名,适用于…

vue3+TS+vueX的记录

要求:在页面中使用输入框输入回车后将数据保存到vuex中的数组list中 list为一个数组 内部三个属性为 id value status id为时间戳 value为string 输入的字符串 status为定义的三种状态 待办 在办 完成 1、创建仓库 将 仓库拆分 import { createStore } fro…

【图像分类实用脚本】数据可视化以及高数量类别截断

图像分类时,如果某个类别或者某些类别的数量远大于其他类别的话,模型在计算的时候,更倾向于拟合数量更多的类别;因此,观察类别数量以及对数据量多的类别进行截断是很有必要的。 1.准备数据 数据的格式为图像分类数据集…

Javascript-web API-day02

文章目录 01-事件监听02-点击关闭广告03-随机点名案例04-鼠标经过或离开事件05-可点击的轮播图06-小米搜索框07-键盘类型事件08-键盘事件-发布评论案例09-focus选择器10-评论回车发布11-事件对象12-trim方法13-环境对象14-回调函数15-tab栏切换 01-事件监听 <!DOCTYPE html…

c语言-------循环结构

基本概念 循环结构是C语言中一种重要的程序控制结构&#xff0c;它允许程序在满足一定条件的情况下&#xff0c;反复执行一段代码。这可以避免重复编写相似的代码&#xff0c;提高代码的效率和可读性。 while循环 语法格式 while (条件表达式) { 循环体语句; } 执行流程 首先判…

Centos创建共享文件夹拉取文件

1.打开VMware程序&#xff0c;鼠标右检你的虚拟机&#xff0c;打开设置 2.点击选项——共享文件夹——总是启用 点击添加&#xff0c;设置你想要共享的文件夹在pc上的路径&#xff08;我这里已经添加过了就不加了&#xff09; 注意不要中文&#xff0c;建议用share&#xff0c…

SpringBoot项目Jar包使用systemctl运行

1. 前言 SpringBoot项目打成jar包后&#xff0c;可以直接使用 java -jar xxx.jar 启动。但是为了方便启动和停止服务&#xff0c;通常我们会写两个脚本&#xff0c;分别是启动脚本 start.sh 和 停止脚本 shutdown.sh&#xff08;这两个脚本内容我们下文会实现&#xff09;&…

计算机网络-L2TP VPN基础概念与原理

一、概述 前面学习了GRE和IPSec VPN&#xff0c;今天继续学习另外一个也很常见的VPN类型-L2TP VPN。 L2TP&#xff08;Layer 2 Tunneling Protocol&#xff09; 协议结合了L2F协议和PPTP协议的优点&#xff0c;是IETF有关二层隧道协议的工业标准。L2TP是虚拟私有拨号网VPDN&…

踩准智能汽车+机器人两大风口,速腾聚创AI+机器人应用双线爆发

日前&#xff0c;RoboSense速腾聚创交出了一份亮眼的Q3财报。受到多重利好消息影响&#xff0c;其股价也应势连续大涨。截止12月9日发稿前&#xff0c;速腾聚创股价近一个月内累计涨幅已超88%。 财务数据方面&#xff0c;速腾聚创在今年前三季度实现总收入约11.3亿元&#xff0…

使用Idea自带的git功能进行分支合并

文章目录 1.背景描述2.分支切换3.分支合并的具体操作4.将在local环境下&#xff0c;从dev合并到qas分支上的代码&#xff0c;推送到远端 1.背景描述 目前在开发的当前项目有四个分支&#xff0c;master(主分支)、pre(预生产分支)、qas(测试分支)、dev(开发分支)&#xff1b; …

EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3

Assignment 6Beta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsTeamwork—Beta SprintTeam NameFZUGOObjectiveSprint Essay 3_Day5-Day6 (12.15-12.16)Other Reference1. WeChat Mini Program Design Guide 2. Javascript Style Guid…

凯酷全科技抖音电商服务的卓越践行者

在数字经济蓬勃发展的今天&#xff0c;电子商务已成为企业增长的新引擎。随着短视频平台的崛起&#xff0c;抖音作为全球领先的短视频社交平台&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也为品牌和商家提供了全新的营销渠道。厦门凯酷全科技有限公司&#xff08;以下简…

架构信息收集(小迪网络安全笔记~

附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;若有错误欢迎指正&#xff01; 2.2 架构信息收集 引子&#xff1a;一个Web应用的构成&#xff0c;由诸多组件&服务相结合&#xff0c;而域名仅是处于Web架构中最表…

一.photoshop导入到spine

这里使用的是 photoshoptospine脚本 下载地址:https://download.csdn.net/download/boyxgb/90156744 脚本的使用,可以通过文件的脚本的浏览,浏览该脚本使用该脚本,也可以将该脚本放在photoshop安装文件夹里的script文件夹下,具体路径:Photoshop\Presets\Scripts,重启photosho…

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎&#xff0c;随着智能驾驶时代的到来&#xff0c;应用也会越来越广泛&#xff0c;关于mapbox-gl和其他地理引擎的详细对比&#xff08;比如CesiumJS&#xff09;&#xff0c;后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…

SparkSQL运行架构及原理

文章目录 SparkSQL运行架构及原理1.1. Catalyst优化器简介1.2. SparkSQL运行架构1.3. SparkSQL解析Core底层原理1.4. 执行计划查看 SparkSQL运行架构及原理 1.1. Catalyst优化器简介 SparkSQL使得我们开发人员可以使用DSL风格的数据来处理数据&#xff0c;甚至可以直接使用SQ…

大数据-254 离线数仓 - Airflow 任务调度 核心交易调度任务集成

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

昇思25天学习打卡营第33天|共赴算力时代

文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台&#xff0c;就像是AI学习者和开发者的超级基地&#xff0c;这里不仅提供丰富的项目、模型和大模型体验&#xff0c;还有一大堆经典数据集任你挑。…

Docker 镜像加速和配置的分享 云服务器搭建beef-xss

前言 最近很多的docker镜像加速都鸡鸡了 找点资源是越来越不容易了 什么事docker 因为我是个业余的人 我简单的说 docker就是比如我们的软件商店的 下载 docker镜像&#xff08;之前就是我们在服务器上搭建网站 和环境的很费力费时 之后就有了这个 镜像 &#xff1a;这…