Java——反射(Class.forName()读取配置文件举例).

榨汁机(Juicer)榨汁机的案例:

分别有水果(Fruit),苹果(Apple),香蕉(Bananal),橘子(Orange),榨汁(squeeze)

要求:

榨出不同的水果汁来喝
//一般方法求解
package com.testl;public class Text1 {public static void main(String[] args) {Juicer j = new Juicer();                //购买榨汁机j.run(new Apple());                     //向榨汁机中放入苹果,榨汁机里面必须有接收苹果方法才行j.run(new Orange());                    //向榨汁机中放入橘子,榨汁机里面必须有接收橘子方法才行//①不同种类的水果都得调用run方法;}}
class Apple{                                    //买了苹果,定义苹果类public void squeeze(){                      //苹果可以榨成苹果汁,所以里面有一个榨汁的方法System.out.println("榨出一杯苹果汁儿");     }
}//苹果汁喝腻了,想喝橘子汁儿
class Orange {public void squeeze(){                      //橘子可以榨成橘子汁,所以里面也有一个榨汁的方法System.out.println("榨出一杯橘子汁儿");     }
}//②不同种类的水果都得定义不同的类class Juicer{                                   //苹果要放在榨汁机里才可以榨汁,所以要,买一个榨汁机
//方法重载  public void run(Apple a){                   //这个方法只管接收苹果,榨汁机里面有个run方法,可以榨汁,这里是放个苹果进去a.squeeze();                            //榨苹果汁}public void run(Orange o){                  //这个方法只管接收橘子,榨汁机里面有个run方法,可以榨汁,这里是放个苹果进去o.squeeze();                            //榨苹果汁//③不同种类的水果都得创建接收不同水果的run方法}
}
从这个程序中,我们可以看出,如果要榨出的果汁种类特别的多的话,这样会特别的麻烦,每种不同的水果都得经过①②③这三步骤。

代码改进:

package com.student.model;
/*多态方法:将苹果,橘子这些水果类向上抽取,抽取成一个接口,一个 水果 接口,
然后,在水果这个接口中有个squeeze(榨汁)的抽象方法,这样的话,
让每个不同种类的水果进行实现那个  水果  接口,
多态的作用是提高了代码的复用性,让程序的扩展性更强*/
public class Text2 {public static void main(String[] args) {Juicer j = new Juicer();                //购买榨汁机 //这之后,想喝什么水果汁就放什么水果就行j.run(new Orange());                    //榨橘子汁儿j.run(new Apple());                     //榨苹果汁儿//①这之后,想喝什么水果汁就放什么水果就行}}
interface   Fruit {public void squeeze();
}class Apple implements Fruit{                                   //买了苹果,定义苹果类public void squeeze(){                      //苹果可以榨成苹果汁,所以里面有一个榨汁的方法System.out.println("榨出一杯苹果汁儿");     }
}class Orange implements Fruit {public void squeeze(){                      //橘子可以榨成橘子汁,所以里面也有一个榨汁的方法System.out.println("榨出一杯橘子汁儿");     }
}//②想榨什么水果得将该水果去实现这个水果接口即可class Juicer{public void run(Fruit f){                   //在这个榨汁的方法里面,直接给  水果 这个对象就行了f.squeeze();}
}
从这个程序中,我们可以看出,如果要榨出的果汁种类特别的多的话,相对于第一个程序来看的话,这样相对简单点,但是,还是有点麻烦,每种不同的水果都得经过①②这两步骤。

代码再进行优化:

package com.StudentSystem.wsq;import java.io.BufferedReader;
import java.io.FileReader;
//配置文件里面只需要写你要读取的类名就行了,创建一个文本即可;
//例如:com.StudentSystem.wsq.Apple
//就是调用了苹果这个方法,先调用哪个直接在配置文件里调用即可    包名.方法名
public class Text3 {public static void main(String[] args) throws Exception {/*public static Class<?> forName(String className)throws ClassNotFoundException返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于: Class.forName(className, true, currentLoader)其中 currentLoader 表示当前类的定义类加载器。参数:className - 所需类的完全限定名。*/BufferedReader br = new BufferedReader(new FileReader("config.txt"));Class clazz = Class.forName(br.readLine());//public T newInstance()throws InstantiationException,IllegalAccessException//创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。   Fruit f = (Fruit) clazz.newInstance();      //父类引用指向子类对象,水果的引用指向了苹果对象Juicer j = new Juicer();                    //购买榨汁机 j.run(f);}}
interface   Fruit {public void squeeze();
}class Apple implements Fruit{                       //买了苹果,定义苹果类public void squeeze(){                          //苹果可以榨成苹果汁,所以里面有一个榨汁的方法System.out.println("榨出一杯苹果汁儿");     }
}class Orange implements Fruit {public void squeeze(){                          //橘子可以榨成橘子汁,所以里面也有一个榨汁的方法System.out.println("榨出一杯橘子汁儿");     }
}class Juicer{public void run(Fruit f){                       //在这个榨汁的方法里面,直接给  水果 这个对象就行了f.squeeze();}
}

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

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

相关文章

java 根据类名示例化类_Java类类getEnclosingClass()方法及示例

java 根据类名示例化类类的类getEnclosingClass()方法 (Class class getEnclosingClass() method) getEnclosingClass() method is available in java.lang package. getEnclosingClass()方法在java.lang包中可用。 getEnclosingClass() method is used to return recent or im…

C++:cin.getline

转&#xff1a;百度百科 http://baike.baidu.com/view/2383876.htm cin.getline 此函数是按行读取,其语法为:cin.getline(字符指针,字符个数N,结束符); 功能是&#xff1a;一次读取多个字符(包括空白字符&#xff09;&#xff0c;直到读满N-1个&#xff0c;或者遇到指定的结束符…

端口复用和重映射--STM32F103

什么是端口复用&#xff1f; STM32中有很多内置外设&#xff0c;这些外设的引脚都是与GPIO复用的&#xff0c;什么时候复用呢&#xff1f;就是当一个GPIO作为内置外设引脚使用时&#xff0c;就叫做复用。比如串口1的发送接收引脚是PA9&#xff0c;PA10&#xff0c;当PA9&#…

考研数学

眼前俨然一副冬的气象&#xff0c;伴随气温的骤降&#xff0c;考研复习也进入异常紧张的阶段。在考试前这两个月里&#xff0c;考生如何复习数学&#xff0c;成绩还可以有所提高。万学?海文数学教研组针对冲刺阶段数学复习归纳总结以下复习经验和建议&#xff0c;供大家参考。…

一个很好的自学网站~推荐一下

http://www.51zxw.net/study.asp?vip15746908

[转]Ubuntu远程桌面登陆

原文地址&#xff1a;http://www.cnblogs.com/xdzone/archive/2011/03/10/1979644.html 1.xp下默认的远程桌面协议是rdp&#xff0c;默认端口3389&#xff0c;而ubuntu用的时vnc&#xff1a;默认端口5900 2.首先被访问的主机&#xff08;windows/linux&#xff09;都要设置为允…

NVIC中断管理---STM32

NVIC&#xff1a;嵌套向量中断控制器 在了解中断之前&#xff0c;我们先了解抢占优先级和响应优先级 抢占优先级和响应优先级 抢占优先级决定能不能打断&#xff0c;高优先级的抢占可以中断低优先级的抢占响应优先级在抢占优先级相同时&#xff0c;高响应优先级先执行&#x…

Java BigDecimal stripTrailingZeros()方法与示例

BigDecimal类stripTrailingZeros()方法 (BigDecimal Class stripTrailingZeros() method) stripTrailingZeros() method is available in java.math package. stripTrailingZeros()方法在java.math包中可用。 stripTrailingZeros() method is used to get a BigDecimal that is…

外部中断---STM32F1

外部中断概述 STM32的中断控制器支持19个外部中断/事件请求&#xff1a; 线0-15&#xff1a;对应外部IO口的输入中断线16&#xff1a;连接到PVD输出线17&#xff1a;连接到RTC闹钟事件线18&#xff1a;连接到USB唤醒事件 STM32每个IO口都有可以作为外部中断输入&#xff0c;…

转:点9图

关于”点九” 转&#xff1a;http://mux.baidu.com/?p1506“点九”是andriod平台的应用软件开发里的一种特殊的图片形式&#xff0c;文件扩展名为&#xff1a;.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向…

Python HTMLCalendar类| 带实例的formatyear()方法

Python HTMLCalendar.formatyear()方法 (Python HTMLCalendar.formatyear() Method) formatyear() method is an inbuilt method of the HTMLCalendar class of calendar module in Python. It works on HTMLCalendar class object and returns an HTML table consisting of th…

2009中国企业家新春联谊会

2009中国企业家新春联谊会——把握当前机遇&#xff0c;笑对经济危机&#xff0c;畅饮将帅美酒尊敬的嘉宾&#xff1a;当前&#xff0c;国际形势正在发生深刻而复杂的变化&#xff0c;由美国次贷危机引发的全球经济危机已经愈演愈烈&#xff0c;美国前五大投资银行有3家宣告破产…

串口通信的基本原理----STM32

串口通信基本原理 1. 处理器与外部设置通信的基本方式 并行通信&#xff1a;数据各个位同时传输串行通信&#xff1a;数据按位顺序传输 在串行通信中&#xff0c;按照数据的传输方向&#xff0c;又分为&#xff1a; 单工&#xff1a;数据传输只支持在一个方向传输半双工&am…

java获取vm运行参数_如何获取在Java中运行Java VM的版本?

java获取vm运行参数To get the version of running VM (Virtual Machine) in Java, we use the getProperties() method, which is defined in System class, while calling the method, we need to pass the property name to get the version of running Java VM. 要获取Java…

Spring MVC+Ant+Tomcat+Eclipse最简单的demo

第一步是Java的Web环境搭建&#xff0c;下载Eclipse&#xff08;或者更好的但收费的IDE-IntelliJ Idea&#xff0c;和Resharper一家公司出的&#xff09;&#xff0c;下载Tomcat&#xff0c;下载JDK&#xff0c;下载Spring&#xff0c;注意安装Tomcat的时候配置一下管理员账号和…

MySQL的环境变量配置详细步骤

1.下载MySQL 例如下载&#xff1a;mysql-installer-community-5.5.60.1 我以这个版本为例 2.右击->我的电脑->属性 3. 4.找到在 系统变量 中找到 Path 5.找MySql的bin目录&#xff08;每个人的电脑上这个文件的位置应该是差不多的&#xff0c;找到之后复制下来&#x…

转帖:强命名程序集(Strong Name Assembly)的概念

强命名程序集&#xff08;Strong Name Assembly&#xff09;的概念因为不同的公司可能会开发出有相同名字的程序集来&#xff0c;如果这些程序集都被复制到同一 个相同的目录下&#xff0c;最后一个安装的程序集将会代替前面的程序集。这就是著名的Windows “DLL Hell”出现的原…

串口发送通信---UART发送---STM32F4实现

串口发送程序配置过程&#xff08;HAL库&#xff09; 初始化串口相关参数&#xff0c;使能串口 HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)该函数的参数是串口的基址&#xff0c;在stm32f429xx.h文件中&#xff0c;定义了8个UART_HandleTypeDef的值&#x…

开源软件 许可证密钥_自由和开源软件-1中的重要许可证

开源软件 许可证密钥Its important to take note that there are no good or bad licenses and that no license is superior to another. Anybody can make an open-source license that suits their extravagant, which is the explanation that there are such huge numbers…

串口接收中断配置过程---STM32F4--HAL

串口接收中断程序配置过程&#xff08;HAL&#xff09; 初始化相关参数&#xff0c;使能串口&#xff1a; HAL_UART_Init();该函数的参数是串口的基址&#xff0c;在stm32f429xx.h文件中&#xff0c;定义了8个UART_HandleTypeDef的值&#xff0c;分别是USART1、USART2、USART…