初始Java反射机制,通过修改工厂设计模式理解反射机制的优点

Java核心编程进阶:设计模式与反射注解泛型实战 设计模式起源于建筑设计领域,后由GoF(Gang of Four)在1994年将其系统化应用于软件工程。在Java开发中,设计模式是解决重复性设计问题的经验结晶,体现了高内聚、低耦合的架构思想。通过封装变化点、提升抽象层次,设计模式使代码更具可读性、可维护性和可扩展性。在业务系统中,频繁访问数据库或远程API会影响响应速度。通过装饰器模式可轻松为任意服务接口添加本地缓存能力。定义服务接口:原始实现:System.out.println("查询数据库..."); 阅读详情

        Java反射机制是Java中很重要的一部分,通过反射可以用另一种,不同于new()的实例化类对象的方法。不用Import导包,用Qualified Name 的字符串实例化对象。(forName()方法) 下面代码通过两种方法实例化Date对象。

import java.util.Date;

public class Fs {
	public static void main(String[] args) {
		Date date = new Date(); //通过正常方式实例化对象
		System.out.println(date);
		
		try {
			Class<?> cls = Class.forName("java.util.Date"); //通过反射实例化Date类对象。
			Date date2 = (Date)cls.newInstance();
			System.out.println(date2);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

        那么问题来了,原本一行 Date date = new Date(); 就解决的问题,用了反射变成了好几行,还必须要异常处理。岂不是自找麻烦,那么反射机制的意义何在呢?

        之前了解过一点工厂设计模式,在“客户端”通过Factory获得不同类的对象,达到了解耦和。但是以前的工厂设计模式有一定的设计缺陷,观察下面代码的Factory类。在每次新增Car的子类时,都需要修改Factory类来适应改变。但是当Car子类增加的速度非常快的时候,Factory类来不及更改,怎么办?就算来得及更改,那么也会产生大量的代码。这时候反射机制的优势就能体现出来了。对比一下Factory2类的产生对象的方式,便可知道反射机制的优势。

package com.jmd.bingo;

interface Car {
	public void drive();
}
class Benz implements Car {
	public Benz() {}
	@Override
	public void drive() {
		System.out.println("---开奔驰---");
		
	}
	
}
class Audi implements Car {
	public Audi() {}
	@Override
	public void drive() {
		System.out.println("---开奥迪---");
		
	}
	
}
class Factory {
	public static Car getInstance(String carname) {
		if("Benz".equalsIgnoreCase(carname)) {
			return new Benz();
		} else if("Audi".equalsIgnoreCase(carname)){
			return new Audi();
		}else {
			return null;
		}
	}
}
class Factory2 {
	public static Car getInstance(String classname) {
		Car car = null;
		try {
			Class<?> cls = Class.forName(classname);
			car = (Car)cls.newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return car;
		
	}
}
public class FsTest {

	public static void main(String[] args) {
		Car mycar1 = Factory.getInstance("benz");
		mycar1.drive();
		Car mycar2 = Factory2.getInstance("com.jmd.bingo.Audi");
		mycar2.drive();

	}

}

输出结果:

---开奔驰---

---开奥迪---


利用java反射原理实现工厂模式 采取java反射机制优化工厂模式,使工厂模式更加灵活。 立即下载

相关推荐

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

java反射实现工厂模式

package Reflect; interface fruit{ public abstract void eat(); } class Apple implements fruit{ public void eat(){ System.out.println("Apple"); } } class Orange implements frui

yan66665的专栏 870

从零到一:Silvaco中跨导曲线的自动化脚本实现

本文详细介绍了如何使用Python脚本在Silvaco中实现跨导曲线(gm曲线)的自动化分析,包括数据加载、跨导计算和结果可视化。通过自动化处理Id-Vg曲线,显著提升半导体器件工程师的工作效率,特别适用于工艺优化和DOE分析。文章还提供了批量处理和关键参数提取的高级技巧,帮助工程师快速掌握Silvaco脚本开发。

nn3456的博客 567

【Java基础】深入理解反射、反射的应用(工厂模式、代理模式)

静态代理的代码在编译时就已经确定,因此代理类需要为每一个被代理类编写一个对应的代理类。这种方式的好处是简单直观,容易理解和掌握,但是当被代理的类较多时,这样如果要追加产品D,只需要新增产品D,无需修改工厂,只需要在需要D产品时,通过对工厂引入产品的全类名就可以生产产品类对象。,动态代理的优势在于可以更加灵活地动态创建代理对象,减少了重复的代理类编写,适用于代理类较多或需要动态管理代理对象的场景。正射很好理解,就不多说了,现在来讲讲反射,同样可以创建对象,调用对象的方法,等等正射能做的事,通过反射都能做。

weixin_45618869的博客 1918

Python实战:用NumPy实现LU分解与QR分解(附代码对比)

本文深入探讨了使用NumPy实现LU分解与QR分解的实战方法,通过代码对比分析了两种矩阵分解技术的原理、数值稳定性差异及核心应用场景。LU分解适用于高效求解线性方程组,而QR分解凭借其正交化特性,在求解最小二乘问题和处理病态矩阵时更具优势。文章提供了详细的Python代码示例,帮助开发者根据具体问题选择最合适的分解方法。

php55的博客 1213

K8s私有仓库拉取镜像报错解决:x509 certificate signed by unknown authority

在Kubernetes环境中使用自签名证书的私有Harbor镜像仓库时,常会遇到证书验证失败的问题。本文将详细讲解如何解决这个常见的证书问题。Kubernetes版本:1.28.2容器运行时:containerd 1.6.20私有仓库:Harbor(使用自签名证书)(超简单搭建私有仓库Harbor-亲测无坑解决K8s私有仓库证书问题的关键在于正确配置容器运行时(本例中是containerd)信任私有仓库的证书。

lzz的博客 2140

java利用反射机制和图形界面简单模仿工厂模式

在我们学习工厂模式的时候,我就在想我们如果要增加一个类的时候,那么工厂模式类里面是不是还要加一段代码,这样是不是太过麻烦,所以我就想到利用反射机制和图形界面来简单模仿工厂模式。下面是我的想法。

atomy_iiii的博客 516

高斯-约当(Gauss-Jordan)消元法——c++代码实现

具体算法的详细原理请参照此篇博客:高斯-约当(Gauss-Jordan)消元法下面是具体c++代码,不保证程序最优化,提供一个可行的程序,供大家改进,同时感谢大家提意见。——大神勿喷呀,我是一个小菜鸟~void Guss_Jordan(int n,double *a)//阶数n 系数矩阵a { double*a_temp = new double[n*n * 2];//a与单位矩阵的组合

zwz的学习之路 6873

Java 之 反射实现工厂模式(简单工厂模式)

之前写过的传统工厂模式在实际中是根本用不到的,它的最大的缺陷在于:每增加一个子类就需要修改工厂类。 而利用反射,每当新增接口子类,无需去修改工厂类代码就可以很方便的进行接口子类扩容。 eg:简单工厂模式 package fansheLX; import static java.lang.Class.forName; interface IFruit{ public void eat()...

C_U_N_Z的博客 863

OpenClaw 运行时错误文档:Embedded Run Agent End with Stream Error(嵌入式运行代理结束流式错误)

OpenClaw运行时错误文档:EmbeddedRunAgentEndwithStreamError(OC-ERR-009) 该错误表示LLM提供商在流式传输过程中发生服务器端异常(HTTP 500),属于可恢复的中等严重性错误。典型表现为日志中出现包含"stream_error"和500状态码的错误信息。系统会自动进行错误分类(50%为服务过载,25%网络问题等),并通过内置机制尝试解决:包括模型切换、API密钥轮换和自动重试策略。用户可采取重试请求、切换模型或简化请求内容等操作,管理

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 552

Java 反射之工厂模式

一.简单工厂模式//接口 package Factory;public interface Fruit { public void eat(); //吃 } //实现接口类 package Factory;public class Apple implements Fruit{public Apple() { // TODO Auto-generated construct

发呆的程序猿 1689

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大

朱小厮的博客 6551

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java反射与设计模式

Properties作为配置文件读取工具,和反射、工厂模式绑定使用,是后端开发读取配置的基础组合,需要熟练掌握load加载、getProperty取值流程。反射提供动态操作类的能力,单例、工厂等设计模式规范对象创建逻辑,二者结合才能写出低耦合、高拓展性的工程代码,是从初级开发进阶中级开发的核心知识点。• 类对象(Class对象):类加载后生成,唯一封装该类全部结构(包名、父类、属性、方法、构造器),一个类仅存在1份。行业通用、反复复用的代码解决方案,共23种,用于规范化代码结构、降低耦合。

u_uYx的博客 250

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

spring中修改注解属性_Java面试Spring

来源:segmentfault.com/u/jack3021Spring篇1.Spring是什么?Spring是一个轻量级的Ioc和AOP容器框架,简化开发,只需要关注业务需求。2. Spring的优点?Spring属于低侵入式设计,代码污染极低。Spring的DI机制可以让容器帮我们管理对象之间的依赖,减少组件之间的耦合度。Spring还提供了AOP技术可以将日志,通用任务进行集中管理...

weixin_39902085的博客 459

spring中修改注解属性_Java面试题总结Spring篇

来源:segmentfault.com/u/jack3021Spring篇1.Spring是什么?Spring是一个轻量级的Ioc和AOP容器框架,简化开发,只需要关注业务需求。2. Spring的优点?Spring属于低侵入式设计,代码污染极低。Spring的DI机制可以让容器帮我们管理对象之间的依赖,减少组件之间的耦合度。Spring还提供了AOP技术可以将日志,通用任务进行集中管理...

weixin_39760857的博客 117

9.20学习记录

抽象⼯⼚模式通过在 AbstarctFactory 中增加创建产品的接⼝,并在具体⼦ ⼯⼚中实现新加产品的创建。Server 确认了:自己发送、接收正常,对方发送、接收正常。如果 key 不存在的话,才会设置 key 的值。Server 确认了:对方发送正常,自己接收正常。Server 确认了对方发送正常,自己接收正常。第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;控制报文发送速率,流量控制。

w75779的博客 1206

batch spring 重复执行_Java面试题总结Spring篇

来源:segmentfault.com/u/jack3021Spring篇1.Spring是什么?Spring是一个轻量级的Ioc和AOP容器框架,简化开发,只需要关注业务需求。2. Spring的优点?Spring属于低侵入式设计,代码污染极低。Spring的DI机制可以让容器帮我们管理对象之间的依赖,减少组件之间的耦合度。Spring还提供了AOP技术可以将日志,通用任务进行集中管理...

weixin_29415667的博客 132

没有运行 spring_Java面试-Spring

来源:segmentfault.com/u/jack3021Spring篇1.Spring是什么?Spring是一个轻量级的Ioc和AOP容器框架,简化开发,只需要关注业务需求。2. Spring的优点?Spring属于低侵入式设计,代码污染极低。Spring的DI机制可以让容器帮我们管理对象之间的依赖,减少组件之间的耦合度。Spring还提供了AOP技术可以将日志,通用任务进行集中管理,可以更好...

weixin_42309087的博客 73

面试题整理(四)

数组和链表的区别 数组是将元素在内存中连续存储的 优点是: 因为数据是在内存中连续存储的,内存地址连续,所以在查询数据的时候效率很高; 缺点是: 在存储之前我们需要申请一块连续的内存空间,并且在编译的时候就需要确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据量比较大的时候,肯能会出现越界的情况,数据比较小的时候,又有可能浪费掉内存空间。在改变数据的个数的shihou,增删改的效率较低。 ...

cdut2016的博客 217

如何理解Spring的IOC和AOP

在传统的java应用中bean的生命周期很简单,使用new进行bean的实例化,然后该bean就可以使用了,一旦该bean不再被使用则由java自动。以及设置相关的属性,让spring容器来生成类的实例对象,在spring容器启动时候,spring会把你在配置中配置的bean都初始化好。这个Resource 指的是BeanDefinition的资源定位,这个过程就是容器找数据的过程。相比之前,spring容器中的bean的生命周期就相对复杂的多了,正确理解spring bean的生命周期非常重要。

cccfire的博客 223

JAVA面试(一)

一、JAVA基础 1、final、finally、finalize区别 2、String、StringBuilder、StringBuffer区别 3、重载和重写的区别 4、抽象类和接口的区别 5、Session和cookie的区别 6、enquals和==的区别 7、get和post请求的区别 8、int和Integer的区别 9、jdk和jre的区别 10、列出5种常见的runtime exc...

Jasmyn飞飞飞的博客 183

Java面试题—框架篇

AOP称为面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,减少系统中的重复代码,降低了模块之间的耦合度,同时提高了系统的可维护性1、记录操作日志2、权限控制3、Spring内置的事务处理记录操作日志核心:使用AOP中的环绕通知+切点表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取到这些参数后,保存到数据库1、创建一个切面类@Aspect。

2301_77368848的博客 942

Java基础复习笔记包括哪些内容?

Java基础复习笔记的内容非常全面,涵盖了从Java语言概述到高级特性的各个方面。以下是详细内容:Java语言概述:面向对象编程:数据类型和数组:集合框架:异常处理:输入输出流(I/O):多线程:JVM(Java虚拟机):实用API:这些内容不仅帮助初学者掌握Java的基础知识,还为进阶学习打下坚实的基础。通过系统地复习这些知识点,可以有效提升编程能力和解决实际问题的能力。在Java中实现高效的异常处理机制,需要遵循一系列最佳实践和原则。以下是一些关键点:使用try-catch语句:这是基本的异常处理方式,

破损的天堂鸟博客 566
上一篇: Android基本控件Spinner的简单使用
下一篇: Java IO操作
bingoCoder
博客等级 码龄10年 1400粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值