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

反射和设计模式

一、反射
1. 相关概念
(1) 类的对象:基于定义好的一个类,创建该类的实例,即利用 new 创建的实例就为类的对象。
(2) 类对象:类加载的产物,封装了一个类的所有信息 ( 包名、类名、父类、接口、属性、方法、构造方法 )
(3) 反射:通过反射可以获取一个类的 类对象,从而获取该类的信息,直接通过类对象进行一系列操作。
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) 通过 类对象 创建 类的对象:
Class c = Class . forName ( "test_flect.Student" ); // 类对象
Object obj = c . newInstance (); // 类对象 获取 类的对象
注意: Class 类中 newInstance() 方法,获取类的对象,默认调用无参数的构造方法。
所以开发时,对于封装的实体类,建议提供无参数的构造方法。
没有提供对应构造方法,创建对象时,报错信息为: java.lang.InstantiationException
(5) 通过有参数的构造方法获取类的对象:
// 获取 类对象
Class c = Class . forName ( "test_flect.Student" );
// 获取有参数的构造方法
Constructor constructor = c . getConstructor ( String . class , Integer . class );
// 通过有参数的构造方法获取 类的对象
Object o = constructor . newInstance ( " 万青 " , 48 );
System . out . println ( o );
(6) 调用某个方法:
Method m = c . getDeclaredMethod ( "test" );
m . setAccessible ( true );
m . invoke ( o );
4. 反射的优缺点:
(1) 缺点:可读性差,代码繁琐,打破封装。
(2) 优点:可以使代码更加通用和灵活。通常用于底层架构,例如:框架等。
二、设计模式 (23 )
1. 设计模式:一套被反复使用,多人知晓,并分门别类的编目的一套代码经验总结。
2. 适配器模式详见接口课后题目。
3. 单例设计模式:常见的一种开发设计模式,在 Java 应用程序中 , 必须保证 JVM 内部仅存在该类的一个实例对象。
(1) 第一种实现方式:饿汉式
// 第一种实现模式:饿汉式
class ClassA {
private static final ClassA ca = new ClassA ();
private ClassA (){}
// 提供
public static ClassA getInstance (){
return ca ;
}
}
优点:线程并发效率高
缺点:空间利用率较低
(2) 第二种实现方式:懒汉式
// 第二种实现方式:懒汉式
class ClassB {
private static ClassB cb ;
private ClassB (){}
public synchronized static ClassB getInstance (){
if ( cb == null ){
cb = new ClassB ();
}
return cb ;
}
}
优点:空间利用率较高
缺点:线程并发效率低
(3) 基于前两种的优缺点,提供第三种方式:
// 第三实现方式:
class ClassC {
private ClassC (){}
private static class Inner {
final static ClassC c = new ClassC ();
}
public static ClassC getIntsance (){
return Inner . c ;
}
}
4. 工厂设计模式:
(1) 工厂设计模式:用于解决程序中对象创建的问题,一个工厂的作用在于完成对象的创建。
(2) 开发时,通常借助反射的技术使工厂通用、灵活。
(3) 扩充 Properties: Hashtable 的子类,即 Map 的实现类
a. Properties: 键和值,默认为 String 类型,创建该类对象时,不要添加泛型。
b. load(InputStream in) / load(Reader in) :自动将流指向文件内容进行加载,一行代表一个集合元素,
自动以 "=" ":" 进行拆分,符号 左侧作为键的内容,右侧作为值的内容
c. String getProperty(String key) :通过键获取对应的值

相关文章:

反射和设计模式

一、反射 1. 相关概念 (1) 类的对象:基于定义好的一个类,创建该类的实例,即利用 new 创建的实例就为类的对象。 (2) 类对象:类加载的产物,封装了一个类的所有信息 ( 包名、类名、父类、接口、属性、方法、构造方…...

双指针---和为s的两个数字

这里写自定义目录标题 题目链接问题分析代码解决执行用时 题目链接 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。 问题分析 暴⼒解法,会超时 (两层…...

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.git 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /root/autodl-tmp/models/Qwen/Qwen2.5-7B-Instruct 微调 llamafactory-cli train \--st…...

智慧农业云平台与水肥一体化:道品科技引领农业现代化新潮流

在当今科技飞速发展的时代,农业也正经历着一场深刻的变革。智慧农业云平台和水肥一体化技术的出现,为农业生产带来了前所未有的机遇和挑战。 一、智慧农业云平台:农业生产的 “智慧大脑” 智慧农业云平台就像是农业生产的 “智慧大脑”&…...

241207_MindNLP中的大模型微调

241207_基于MindNLP的大模型高效微调 现在的大模型体量非常庞大,全量微调所需要的算力也特别庞大,个人开发者没有条件微调。参数量达到7B的模型才刚刚有涌现能力,但是我们要微调7B的模型的话,就需要328G的显存,至少需…...

MongoDB、Mongoose使用教程

文章目录 一:MongoDB 简介1.1 什么是 MongoDB1.2 特点1.3 与关系数据库的区别:1.4 资源链接: 二:安装 MongoDB2.1 安装前的准备2.2 安装、启动 MongoDB2.3 创建用户 MongoDB 三、连接四:MongoDB 基础操作4.1 库操作&am…...

单片机:实现控制步进电机正反转(附带源码)

1. 步进电机概述 步进电机(Step Motor)是一种能够将电能转换为机械能的电动机。其独特之处在于能够精确地控制转动角度,因此被广泛应用于需要精确控制的场合,如打印机、机器人、数控机床、自动化设备等。 步进电机的转动是以“步…...

安装指南|OpenCSG Starship上架GitHub Marketplace

在代码开发的日常中,你是否常常被以下问题困扰? 代码审查耗时太长,拖慢项目进度? 审查质量参差不齐,一些关键问题被遗漏? 复杂代码变更看不懂,审查者需要大量时间理解意图? 别担…...

Excel设置生日自动智能提醒,公式可直接套用!

大家好,我是小鱼。 今天跟大家分享一个WPS表格中根据出生日期,设置生日提醒,并且根据距离生日天数自动标记数据颜色。简单又实用,一个公式轻松搞定! 接下来我们先学习一下需要使用到的函数,然后再根据实例让…...

同步异步日志系统:前置知识

一、日志项目的介绍 1.1 为什么要有日志系统 1、⽣产环境的产品为了保证其稳定性及安全性是不允许开发⼈员附加调试器去排查问题,可以借助日志系统来打印⼀些⽇志帮助开发⼈员解决问题 为什么不直接printf打印在屏幕上呢??因为现实中没有…...

微服务设计原则——功能设计

文章目录 1.ID生成2.数值精度3.DB操作4.性能测试5.版本兼容5.1 向旧兼容5.2 向新兼容 6.异步时序问题7.并发问题7.1 并发时序7.2 并发数据竞争 参考文献 1.ID生成 在分布式系统中,生成全局唯一ID是非常重要的需求,因为需要确保不同节点、服务或实例在并…...

低代码软件搭建自学的第一天——熟悉PyQt

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 学习计划第 1 步:环境搭建1.1 安装 Python1.2 安装 PyQt安装命令:验证安装: 第 2 步:PyQt 基础知识2.1 创建第一个窗…...

基于Python3编写的Golang程序多平台交叉编译自动化脚本

import argparse import os import shutil import sys from shutil import copy2from loguru import loggerclass GoBuild:"""一个用于构建跨平台执行文件的类。初始化函数,设置构建的主文件、生成的执行文件名称以及目标平台。:param f: 需要构建的…...

远程桌面连接

电脑A:使用机 电脑B:被控制的另一个 方法1: 在电脑B上操作 ①winr输入cmd进入命令行窗口,输入ipconfig查询本机地址 ②我的电脑/此电脑 右键点击“属性” ③选择屏幕右边“远程桌面” ④打开“启用远程桌面” ⑤打开设置&am…...

网络地址转换NAT

NAT(Network Address Translation) 方法于1994年提出。需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球地址IPG。 所有使用本地地址的主机在和外界通信时都要在NAT路由器上将其本地地址转换成外部全球…...

什么是CRM管理软件?CRM的基本概念、功能、选择标准、应用场景

什么是CRM管理软件? 嘿,大家好!今天咱们聊聊一个在现代企业管理中非常重要的工具——CRM管理软件。CRM是Customer Relationship Management(客户关系管理)的缩写,简单来说,它就是一个帮助企业和…...

Python编程常用的19个经典案例

Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍36个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。 1. 列表推导式 fizz_buzz_list ["FizzBuzz" if i % 15 0 else "Fizz" if i % 3 0 else "Buzz…...

【Unity基础】AudioSource 常用方法总结

在 Unity 中,AudioSource 组件用于控制音频的播放和管理。以下是常用的 AudioSource 控制方法及其说明。 1. 播放和暂停音频 Play():开始播放音频,如果是从暂停的地方继续播放,可以直接调用。Pause():暂停当前播放的…...

CSS系列(25)-- 滚动优化详解

前端技术探索系列:CSS 滚动优化详解 📜 致读者:探索流畅滚动的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 滚动优化,学习如何创建流畅、高性能的滚动体验。 平滑滚动 🚀 基础设置 /* …...

CST天线设计的六大核心特点:为天线分析提供完整解决方案!

CST Studio Suite 为天线设计提供了从最初的概念评估到最终的合规性测试所需的所有功能,确保天线设计在各种环境下实现稳定通信。这一套工具覆盖了所有重要的设计阶段,帮助设计师顺利完成从概念到成品的全过程。 下面我们来看一看CST电磁仿真中天线设计…...

Crustocean/conch:轻量级容器化工具,简化开发者本地环境搭建

1. 项目概述:一个面向开发者的轻量级容器化工具最近在和一些做后端开发的朋友聊天,发现大家普遍有个痛点:本地开发环境和线上环境不一致,导致“在我机器上好好的”这种经典问题频繁上演。虽然Docker已经普及,但完整的D…...

不想做程序员了,听说网络安全前景好,现在转行还来得及吗?

不想做程序员了,听说网络安全前景好,现在转行还来得及吗? 我去年四月份被裁员,找了两个月工作,面试寥寥无几,就算有也都是外包,而且外包也没面试通过。我经历了挫败,迷茫&#xff0…...

Delphi7 突破局限!借助Python扩展程序能力。

在桌面开发领域,Delphi7 凭借其简洁高效的可视化开发能力、稳定的运行性能,至今仍被许多开发者用于工业自动化、金融终端、桌面工具等项目开发。但不可否认的是,Delphi7 在网络数据抓取、AI交互、复杂数据处理等场景中存在天然局限&#xff0…...

从计数器到计时器:使用Spectator构建可观测性系统的实践指南

1. 项目概述:从“观众”到“观察者”的视角转变在软件开发,尤其是后端服务开发中,我们常常需要一种机制来观察和度量系统的内部状态。这种观察不是简单的日志打印,而是系统化、结构化地收集运行时指标,比如接口的调用次…...

DeepSeek在MMLU基准测试中狂揽86.7分:这3个被99%开发者忽略的推理优化技巧,立竿见影!

更多请点击: https://intelliparadigm.com 第一章:DeepSeek在MMLU基准测试中狂揽86.7分:技术突破与行业意义 DeepSeek-V3 在涵盖57个学科领域的MMLU(Massive Multitask Language Understanding)基准测试中取得86.7%的…...

自动驾驶-数据解析01:四元数04【nuPlan 数据集中的 ego2global_rotation 四元数是采集时生成的,还是后期处理得到的?】

标题:nuPlan 数据集中的 ego2global_rotation 四元数是采集时生成的,还是后期处理得到的? 1. 先给结论 在讨论 nuPlan 数据集中的自车姿态四元数时,不能简单地说: 它一定是车辆采集瞬间直接生成的原始四元数。也不能简单地说: 它是后期人工标注生成的四元数。更准确的…...

大厂4年经验Java面试题深入解析(10道,排版优化版)

大厂 4 年经验 Java 面试题深入解析(10 道) 这篇文章不是面向校招,也不是面向只会背八股的初级候选人,而是针对已经有 4 年左右实际项目经验、准备冲击大厂的 Java 工程师。 大厂面试更看重你是否能把基础原理、线上问题、设计取舍…...

量子退火误差缓解:经典阴影与局部虚拟纯化技术

1. 量子退火中的误差挑战与经典阴影方法量子退火(Quantum Annealing, QA)作为量子计算领域的重要算法,在优化问题求解中展现出独特优势。然而,实际硬件实现时面临的退相干问题严重制约了其计算精度。传统量子纠错方案需要大量物理…...

Transformer与NLP资源全指南:从原理到工程实践的高效学习路径

1. 项目概述:为什么我们需要一个Transformer与NLP的“Awesome”清单?如果你在过去几年里深度参与过自然语言处理(NLP)领域的工作或学习,那么“Transformer”这个词对你来说,可能已经从一种新颖的架构&#…...

基于MCP协议构建阿里云SLS日志AI查询助手:原理、部署与实战

1. 项目概述:当阿里云SLS遇上MCP如果你正在用阿里云日志服务(SLS)做日志分析,同时又想用上像Claude、Cursor这类AI编程助手来帮你写查询、分析数据,那你可能已经感受到了一个痛点:如何在AI助手和你的日志数…...