Java动态加载类在功能模块开发中的作用

  Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册、发送邮件等功能,代码如下:

 1 /*
 2  * web功能实现类
 3  */
 4 public class Web {
 5     
 6     public static void main(String[] args) {
 7         //每次有新功能都需要重新加载
 8         if("UserReg".equals(args[0])) {
 9             UserReg ur = new UserReg();
10             ur.action();
11         }
12         if("SendEmail".equals(args[0])) {
13             SendEmail se = new SendEmail();
14             se.action();
15         }
16         
17         
18     }
19     
20 }

   上面的代码简单的通过命令行的参数进行功能的调用,当然扩展到web的url参数原理也完全一样,通过代码可以看到,我们需要调用某一个功能,则必须实例化该功能所在的对象,并且每当添加一个新功能时,必须再写一个if语句进行添加,并不能动态扩展;假设当我们只有UserReg类时,SendEmail类正在开发中,那么这两个功能都是无法使用的,因为如果实例化一个不存在的类时编译器会报错,代码根本无法通过编译。这些所说的就是Java的静态加载,静态加载的含义就是在程序的编译阶段进行加载,当出现任何类不存在或者方法不存在的错误时,编译都不通过,这就是Java中的静态加载

  那么与静态加载相对应的动态加载的含义就是在程序运行时真正的执行代码,编译过程不进行任何检查,这样就避免了上面的问题,实现方式就是通过类的反射,我们改进上面的执行类为动态加载的,代码如下:

 1 /*
 2  * web功能实现类
 3  * 动态加载举例
 4  */
 5 public class Web {
 6     
 7     public static void main(String[] args) {
 8         try {
 9             Class<?> w = Class.forName("net.zengzhiying.dynamicloading." + args[0]);
10             IWeb i = (IWeb) w.newInstance();
11             i.action();
12         } catch (ClassNotFoundException e) {
13             e.printStackTrace();
14         } catch (InstantiationException e) {
15             e.printStackTrace();
16         } catch (IllegalAccessException e) {
17             e.printStackTrace();
18         }
19     }
20     
21 }

  上面代码就是通过forName方法进行反射从而动态加载类,w就是对应类的类类型,同时也是Class的对象,所以从某种意义上来说,万事万物皆是对象,类也是对象,类对象和类的对象是严格区分的,类对象也就是类类型,那么使用类类型的newInstance方法可以创建该类类型的类的对象;另外为了解决每次实例化对象类都不同的问题,这里使用的父接口来统一声明,我们需要任何功能只需要实现IWeb接口即可,不同功能模块由不同的程序员实现也是没问题的,或者使用父类或者抽象类来统一声明,子类中进行方法的重写或实现也可以,总之这个地方就是利用的多态的思想来实现,IWeb接口代码如下:

1 public interface IWeb {
2     public void action();
3 }

  那么我们现在实现其中的模块:

  UserReg.java

1 public class UserReg implements IWeb {
2     
3     public void action() {
4         System.out.println("我实现了用户注册的功能!");
5     }
6 }

  SendEmail.java

1 public class SendEmail implements IWeb {
2     public void action() {
3         System.out.println("我实现了发送电子邮件的功能");
4     }
5 }

  以上这些代码通过编译是没有任何问题的,那么执行的时候我们使用命令行执行来传参数,eclipse不能直接执行,效果如下:

  

  通过执行可以看到,很容易的通过参数实现了不同的功能操作,对于不存在的功能,那么很显然会抛出异常,因为编译阶段没有经过严格的验证,所以抛出异常也是必然的,实际开发中我们要进行恰当的异常处理,这样就用动态加载实现了功能模块的无限扩展,我们后来添加UserLogin用户登录模块或者添加UserLogout用户退出模块,完全不必要修改Web主类中所有的代码,只是都实现IWeb接口即可,这种动态加载类的思想在框架底层应用中也是经常用到的。

 

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

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

相关文章

创业者们的19个Surprises

郑昀玩聚SR 20091115 『毫无疑问&#xff0c;短跑运动员在起跑时速度最快&#xff0c;而后就变慢下来&#xff0c; 获胜者是变慢得最少的那个人。大多数创业公司也是如此。』 ——Paul Graham January 2007 上面这句笺言的作者Paul Graham最近问了Y Combinator旗下创业项目的创…

自学电脑编程_程序人生:盲人程序员蔡勇斌——用耳朵打开盲人的程序世界 - 沐歌爱编程...

有句话说&#xff1a;没有你想不到&#xff0c;只有你做不到。今天想为大家介绍一位程序员界中的励志人物&#xff0c;他就是蔡勇斌。蔡勇斌幼年失明&#xff0c;靠着顽强的毅力和不服输的精神自学编程&#xff0c;成为了一名全栈工程师。他是阿里“多隆奖”首位盲人获得者&…

qtabwidget的图标_QTabWidget每个标签上的关闭按钮怎样设置

自己做窗标题栏首先[DllImport("User32.dll", EntryPoint "ReleaseCapture")] static extern long ReleaseCapture(); [DllImport("User32.dll", EntryPoint "SendMessage")] private static extern int SendMessage(IntPtr hWnd, i…

poj 2299 (归并排序)

给定一个无序的数列&#xff0c;由32位整数组成的&#xff0c;序列长度可达500000&#xff0c;现在通过不断的两两交换&#xff0c;把这个序列排成由小到大的有序序列&#xff0c;问交换的次数是多少。 1 #include<stdio.h>2 #include<stdlib.h>3 #define NN 50000…

SQLite轻量级数据库,操作数据常用语句

2019独角兽企业重金招聘Python工程师标准>>> -----创建表---- ----------表格头英文换中文显示select name as 名字,age 年龄,class from student -----if not exists判断表存在否--字符串用char也行--- --如果用自增长&#xff0c;只能用包装类型integer,不能用int…

.NET常用功能和代码[总结与收藏] (转)

.NET常用功能和代码[总结与收藏] 1. 打开新的窗口并传送参数&#xff1a; 传送参数&#xff1a;response.write("<script>window.open(*.aspx?id"this.DropDownList1.SelectIndex"&id1"...")</script>") 接收参数&#xff1a;s…

deepin安装卡死在蓝色背景_求大神帮助~安装DEEPIN系统卡在蓝色背景图什么原因...

可能是联想拯救者 R7000笔记本的原因&#xff0c;用以下方法解决了先点开联想的电脑管家 你能在左边栏找到一个选项 那个选项是显卡模式点击进去→然后选择独显模式(如果找不到就在当前界面里面选择调回游戏模式)然后重启电脑确认你的电脑进入了独显模式然后再次重启按F2(单按…

cuda编程_CUDA编程入门(四)并行归约算法

这一篇我们一起学习一下如何使用CUDA实现并行归约算法。首先我们要知道什么是并行归约。并行归约&#xff08;Reduction&#xff09;是一种很基础的并行算法&#xff0c;简单来说&#xff0c;我们有N个输入数据&#xff0c;使用一个符合结合律的二元操作符作用其上&#xff0c;…

在ubuntu下各种格式软件安装及常用命令

Ubuntu下软件安装的几种方式&#xff1a; (1).bundle 格式 以VMware-Workstation-Full-7.0.0-203739.i386.bundle为例 命令如下&#xff1a;sudo sh VMware-Workstation-7.0.0-203739.i386.bundle(先切换到该文件所在文件夹) (2).deb格式 最常用的是deb包&#xff0c;deb是deb…

解决Windows客户端访问vsftpd服务器中文乱码问题

上周五-业务部同事反馈客户使用我司的FTP服务&#xff0c;发现文件和目录是中文全部乱码,不方便查看修改文件目录等操作故障原因&#xff1a;vsftpd不能处理字符编码的转换&#xff0c;Windows使用GBK编码&#xff0c;linux使用zh_CN.UTF-8编码解决方法&#xff1a;1、使用能够…

csgo怎么控制电脑玩家_电脑怎么远程控制他人电脑,教您给电脑设置远程控制的方法...

有些时电脑出现了一些我们解决不了的问题时&#xff0c;这时我们一定第一时间想到就是让电脑高手帮忙看一下问题&#xff1b;但要对方在异地该办呢&#xff0c;那就通过电脑远程来解决了&#xff1b;那么问题又来了&#xff0c;电脑怎么远程控制他人电脑呢&#xff1f;小编下面…

JAVA实验报告九异常处理_JAVA实验报告_Java异常处理

贵州大学实验报告学院&#xff1a;计信学院专业&#xff1a;网络工程班级&#xff1a;101 姓名学号实验组实验时间05.27 指导教师肖源源成绩实验项目名称Java异常处理实验目的1)掌握Java异常的概念及工作机制2)掌握异常的分类3)掌握抛出异常语句的使用(throw)4)掌握抛出捕获处理…

win8下vs2012加wp8 sdk开发xna4.0PC游戏

vs2012安装wp8后&#xff0c;只能开发手机端的xna游戏程序&#xff0c;没有xbox和pc端的&#xff0c;看来官方是不打算更新了&#xff0c;不过我们还是有办法的。前提条件下&#xff0c;您得安装了vs2010和xna4.0 game studio或者是windows phone sdk 7.1。如果您没有安装wp8&a…

div悬浮在固定位置_悬浮式超声波致动器概要及研究动向

作者&#xff1a;东京工业大学 中村 健太郎1. 序言以往的超声波马达是通过摩擦力驱动&#xff0c;固定片压电振子与转子接触&#xff0c;通过振动摩擦转子从而获得旋转力和推动力。虽然具有高转矩、高控制性等特点&#xff0c;从原理上讲其速度无法超过振子振动速度。压电振子的…

基于Java的设计开题报告_基于Java的电子邮件的收发系统的设计与实现开题报告...

基于Java的电子邮件的收发系统的设计与实现开题报告 (8页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.90 积分开题报告 基于 Java 的电子邮件的收发系统的设计与实现 一、选题的背景、意义 1、 电…

Java GUI 开发专题

Java GUI 开发专题 IBM http://www.ibm.com/developerworks/cn/java/j-gui/#N10095 作者&#xff1a;wenhai_zhang 发表于2009-11-25 23:53:00 原文链接 阅读&#xff1a;7 评论&#xff1a;0 查看评论 转载于:https://www.cnblogs.com/wenhaizhang/archive/2009/11/25/2099172…

Zookeeper-源码启动

源码启动zookeeper zookeeper源码下载地址&#xff1a; //选择分支3.5.8 https://github.com/apache/zookeeper.git 源码导入idea后&#xff0c;org.apache.zookeeper.Version类会报错&#xff0c;需要建一个辅助类 //全局搜索org.apache.zookeeper.Version这个类就找到了…

python之获取微信服务器的ip地址

# -*- coding: cp936 -*- #PYTHON 27 #xiaodeng #获取微信服务器的ip地址import urllib urlhttps://api.weixin.qq.com/cgi-bin/getcallbackip data{access_token:VchuOKNr8X9tZVDrY_yG9qiJus_1nO1a7uT_iwWVwgGFdzPhPyaqreTE_qMKPas4SwRNif5k0A1zVw6Y9eTPI4CAYiUwpJvHdBt4fzDTR…

pandas 取excel 中的某一列_Excel快速分表(xlwings+pandas)

Excel总表快速分表&#xff1a;step1: 读取exel数据到DataFramestep2: dataframe中数据进行筛选step3&#xff1a;将筛选完的数据存储到excel中工作中应用实例step1&#xff1a;读取Excel的数据到pandas 的Dataframe方法1&#xff1a;采用pandas&#xff0c;读取sheet1的内容到…

[转]C#连接操作mysql实例

本文转自&#xff1a;http://hi.baidu.com/zhqngweng/item/c4d2520cb7216877bfe97edf 第三方组件&#xff1a;Mysql.Data.dll说明&#xff1a;去官方网站下载Mysql.Data.dll&#xff0c;然后在项目中添加该组件的引用&#xff0c;在代码页里输入using Mysql.Data.MysqlClient&a…