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. Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError

    SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackO ...

  2. Oracle常用sql

    Oracle不像Sqlserver,并没有提供l默认约束,但提供了默认值,效果一样.--------------------------- 在建表时设置默认约束-------------------- ...

  3. 修复VirtualBox "This kernel requires the following features not present on the CPU: pae Unable to boot

    问题描述: 1.机器:Linux主机,特别是主机为大内存,比如: 4G内存的使用pae内核的Ubuntu系统的dell电脑. 2.情况:使用VirtualBox安装Linux系统时,比如:通过Virt ...

  4. Bookmarklet

    学习 http://www.ruanyifeng.com/blog/2011/06/a_guide_for_writing_bookmarklet.html

  5. Sencha Touch 2.2.1 Custom Icon 自定义图标

    ST2.2版本竟然又改变了sass中自定义图标的添加方式,在2.2以前采用的是这种base64的方式,详见:http://www.cnblogs.com/qidian10/archive/2012/1 ...

  6. sql server 复制需要有实际的服务器名称才能连接到服务器(转载)

    今天在做sql server 2005 复制的时候,提示复制需要有实际的服务器名称才能连接到服务器……的消息,一开始不知道什么意思!后来在网上查了一下才知道,原来是以前我把机器改过名 字.用selec ...

  7. tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍

    tcpdump wireshark 实用过滤表达式(针对ip.协议.端口.长度和内容) 实例介绍 标签: 网络tcpdst工具windowslinux 2012-05-15 18:12 3777人阅读 ...

  8. VIM、GVIM在WINDOWS下中文乱码的终极解决方案

    文章转自:http://www.liuhuadong.com/archives/68 vim.gvim在windows下中文乱码的终极解决方案在windows下vim的中文字体显示并不好,所以我们需要 ...

  9. web前端跨域方案

    ajax跨域请求   qzfl实现 跨子域的xhr 原生xhr不支持跨域,通过iframe+proxy.html达到跨子域 假如A页面要请求B页面,A.B跨子域.A创建指向B的proxy页的ifram ...

  10. The Bottom of a Graph(tarjan + 缩点)

    The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9139   Accepted:  ...