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

 /*
* web功能实现类
*/
public class Web { public static void main(String[] args) {
//每次有新功能都需要重新加载
if("UserReg".equals(args[0])) {
UserReg ur = new UserReg();
ur.action();
}
if("SendEmail".equals(args[0])) {
SendEmail se = new SendEmail();
se.action();
} } }

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

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

 /*
* web功能实现类
* 动态加载举例
*/
public class Web { public static void main(String[] args) {
try {
Class<?> w = Class.forName("net.zengzhiying.dynamicloading." + args[0]);
IWeb i = (IWeb) w.newInstance();
i.action();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} }

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

 public interface IWeb {
public void action();
}

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

  UserReg.java

 public class UserReg implements IWeb {

     public void action() {
System.out.println("我实现了用户注册的功能!");
}
}

  SendEmail.java

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

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

  

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

Java动态加载类在功能模块开发中的作用的更多相关文章

  1. java动态加载类和静态加载类笔记

    JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...

  2. Java动态加载类

    详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...

  3. 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。

    (转载声明出处:http://www.cnblogs.com/linguanh/) 简介:      该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作, ...

  4. java reflect 初始学习 动态加载类

    首先要理解Class类: 在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的 ...

  5. java反射机制与动态加载类

    什么是java反射机制? 1.当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射. IT行业里这么说,没有 ...

  6. Java运行时动态加载类之ClassLoader

    https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...

  7. Java 反射理解(二)-- 动态加载类

    Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...

  8. java反射动态加载类Class.forName();

    1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...

  9. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

随机推荐

  1. 【CodeForces 626C】Block Towers

    题意 给你n,m,如果 n个2的倍数和m个3的倍数,这n+m个数各不相同,那么求最大的数的最小值. 分析 方法1:枚举最大值为i,直到 i/2+i/3-i/6(不重复的2或3的倍数)≥n+m,并且要i ...

  2. Android中的Uri.parse()

    1,调web浏览器 Uri myBlogUri = Uri.parse("http://www.baidu.com"); returnIt = new Intent(Intent. ...

  3. 关于ActionContext.getContext()的用法

    为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了 ...

  4. 洛谷P1993 小 K 的农场

    题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...

  5. chroot详解

    我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...

  6. jQuery返回顶部(精简版)

    jQuery返回顶部(精简版) <!DOCTYPE html><html lang="en"><head> <meta charset=& ...

  7. MyEclipse修改项目名称后,部署到 tomcat问题

    问题描述: 修改项目名称后,部署到tomcat问题 解决方案: 项目->属性->myelcipse->web下,修 改web context root就可! 要在eclipse里面改 ...

  8. PHP防止重复提交表单(helloweba网站经典实例)

    <?php session_start(); header("Content-Type:text/html;charset:utf8"); function set_toke ...

  9. eclipse中新建javaweb项目,查看某些类的源码

    网上查到的大多说在项目下选择properties,在java Build Path下Add ExternalJAR Selection,加上Tomcat->lib下的servlet-api.ja ...

  10. linux下安装phpredis扩展--update20141127

    ***今天又装了phpredis,更新一下phpredis的下在地址**** 1.下载php所需的模块owlient-phpredis-90ecd17.tar.gz(tar.gz文件下载:owlien ...