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

一、反射

 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;      

               }  

          }

     }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arduino继电器与电机水泵的使用

首先说一句,真受不了网上的教程,大海里捞金,要不上来了就讲原理,怎么具体使用一句不说,要么炫技来了。 继电器,简单来说把他当开关看,通过小电流控制大电流(原理去看其他视频),要记…

【Java Web】Axios实现前后端数据异步交互

目录 一、Promise概述 二、Promise基本用法 三、async和await关键字 四、Axios介绍 4.1 Axios基本用法 4.2 Axios简化用法之get和post方法 五、Axios拦截器 六、跨域问题处理 一、Promise概述 axios是代替原生的ajax实现前后端数据交互的一套新解决方案,而…

网络编程 03:端口的定义、分类,端口映射,通过 Java 实现了 IP 和端口的信息获取

一、概述 记录时间 [2024-12-19] 前置文章: 网络编程 01:计算机网络概述,网络的作用,网络通信的要素,以及网络通信协议与分层模型 网络编程 02:IP 地址,IP 地址的作用、分类,通过 …

webdriver 反爬虫 (selenium反爬虫) 绕过

1. webdriver 反爬虫原理 爬虫程序可以借助渲染工具从动态网页中获取数据。 在这个过程中,“借助”其实是通过对应的浏览器驱动(即WebDriver)向浏览器发出指令的行为。因此,开发者可以根据客户端是否包含浏览器驱动这一特征来区分…

JAVA 零拷贝技术和主流中间件零拷贝技术应用

目录 介绍Java代码里面有哪些零拷贝技术java 中文件读写方式主要分为什么是FileChannelmmap实现sendfile实现 文件IO实战需求代码编写实战IOTest.java 文件上传阿里云,测试运行代码看耗时为啥带buffer的IO比普通IO性能高?BufferedInputStream为啥性能高点…

系统移植——Linux 内核顶层 Makefile 详解

一、概述 Linux Kernel网上下载的版本很多NXP等有自己对应的版本。需要从网上直接下载就可以。 二、Linux内核初次编译 编译内核之前需要先在 ubuntu 上安装 lzop 库 sudo apt-get install lzop 在 Ubuntu 中 新 建 名 为 “ alientek_linux ” 的 文 件夹 , …

Reactor

文章目录 正确的理解发送double free问题解决 1.把我们的reactor进行拆分2.链接管理3.Reactor的理论 listensock只需要设置_recv_cb,而其他sock,读,写,异常 所以今天写nullptr其实就不太对,添加为空就没办法去响应事件…

【深度学习】 零基础介绍卷积神经网络(CNN)

CNN学习 零基础介绍写个CNN最简单的代码一. 概述二. 搭建CNN1. 输入层2. 卷积层3. 激活层4. 池化层5. 全连接层6. 网络搭建小结7. 损失函数8. 梯度下降9. 反向传播10. 模型评估与正则化11. 尝试搭建自己的第一个CNN 三. 经典CNN结构四. 猫狗识别项目实践1. Paddle实现版本&…

Leetcode打卡:找到稳定山的下标

执行结果:通过 题目: 3258 找到稳定山的下标 有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。 对于下标不为 0 的一座山&#xf…

leetcode刷题日记03——javascript

题目3: 回文数https://leetcode.cn/problems/palindrome-number/ 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向…

服务器数据恢复—RAIDZ离线硬盘数超过热备盘数导致阵列崩溃的数据恢复案例

服务器存储数据恢复环境: ZFS Storage 7320存储阵列中有32块硬盘。32块硬盘分为4组,每组8块硬盘,共组建了3组RAIDZ,每组raid都配置了热备盘。 服务器存储故障: 服务器存储运行过程中突然崩溃,排除人为误操…

Tact智能合约安全实践:TON生态系统中的常见错误

TON(The Open Network)以其创新特性和强大的智能合约性能,不断拓宽区块链技术的边界。基于早期的区块链平台(如以太坊等)的经验与教训,TON为开发者提供了一个更加高效且灵活的开发环境。其中推动这一进步的…

C进阶—指针(1)

若是阁下满意的话,可否一键三连呢! 第一篇进阶指针就是先了解各种新的概念(用法我们后面几篇再详细说!先只介绍概念),有疑惑很正常,只是暂时的,我们一起来看看吧! 字符指…

【Python使用】嘿马头条项目从到完整开发教程第9篇:缓存,1 缓存穿透【附代码文档】

本教程的知识点为:简介 1. 内容 2. 目标 产品效果 ToutiaoWeb虚拟机使用说明 数据库 理解ORM 作用 思考: 使用ORM的方式选择 数据库 SQLAlchemy操作 1 新增 2 查询 all() 数据库 分布式ID 1 方案选择 2 头条 使用雪花算法 (代码 toutiao-backend/common/…

谷歌浏览器的扩展程序自动更新设置

谷歌浏览器是全球最受欢迎的网络浏览器之一,其扩展程序更是为用户提供了丰富的功能。然而,随着时间的推移,扩展程序需要更新以修复漏洞、提升性能或增加新功能。本文将详细介绍如何在Chrome中设置扩展程序的自动更新。(本文由http…

LabVIEW与PLC点位控制及OPC通讯

在工业自动化中,PLC通过标准协议(如Modbus、Ethernet/IP等)与OPC Server进行数据交换,LabVIEW作为上位机通过OPC客户端读取PLC的数据并进行监控、控制与处理。通过这种方式,LabVIEW能够实现与PLC的实时通信&#xff0c…

在Windows Server路由和远程访问服务中启用L2TP/IPsec VPN

背景 路由和远程访问服务(Routing and Remote Access Services,RRAS)是Windows Server上的一个角色,包含很多功能,可以用来搭建VPN。然而,在什么也不做的初始配置中,它只允许PPTP协议连接。然而…

Android简洁缩放Matrix实现图像马赛克,Kotlin

Android简洁缩放Matrix实现图像马赛克,Kotlin 原理,通过Matrix把一个原图缩小到原先的1/n,然后再把缩小后的小图放大n倍,自然就是马赛克效果(相当于是放大后像素“糊”成一片了)。 import android.content.…

《Posterior Collapse and Latent Variable Non-identifiability》

看起来像一篇很有用的paper,而且还是23年的 没看完 后边看不懂了 Abstract 现有的解释通常将后验崩塌归因于由于变分近似而使用神经网络或优化问题。 而本文认为后验崩塌是潜在变量不可识别性的问题(a problem of latent variable non-identifiability) 本文证明了…

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题: 1)不同单位在视频平台建设中以所属领域为单位,设备品牌众多,存在的标准不一,各系统之间也没有统一标准; 2)各单位视频平台建设分散、统筹性差&am…