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. SQL Network Interfaces, error: 50 - 发生了 Local Database Runtime 错误。无法创建自动实例。

    今天在用VS2013自带的LocalDB调整数据库时出错,在网上也搜到许多方案,如卸载SQLServer LocalDB的程序.重新创建实例等都没有解决我的问题,也重新修改以及修复Vs,问题依旧存在, ...

  2. Excel 计算 tips

    1.  对一列数据想看看,distinct的结果 选中数据区域(包含列名),插入pivot table 2. 想检查一个单元格的值在不在某一列中,并返回标志值 =IF (COUNTIF(B:B,A1) ...

  3. Dinic问题

    问题:As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Offic ...

  4. poj 1061 扩展欧几里得解同余方程(求最小非负整数解)

    题目可以转化成求关于t的同余方程的最小非负数解: x+m*t≡y+n*t (mod L) 该方程又可以转化成: k*L+(n-m)*t=x-y 利用扩展欧几里得可以解决这个问题: eg:对于方程ax+ ...

  5. Laravel 5 中的配置

    介绍 Laravel 的所有的配置文件都放在了 config 这个目录的下面.每个选项都有介绍. config├── app.php├── auth.php├── cache.php├── compi ...

  6. CustomerConfigHelper

    public static class CustomerConfigHelper { public static object _lockObject = new object(); private ...

  7. nginx+php出现502 不能解析

    到php-fpm下面查看配置文件看引用的文件,找到listening 在nginx里面配置为sock方式

  8. Why The Golden Age Of Machine Learning is Just Beginning

    Why The Golden Age Of Machine Learning is Just Beginning Even though the buzz around neural networks ...

  9. 改变placeholder颜色

    /* WebKit browsers */ ::-webkit-input-placeholder { color: red; text-overflow: ellipsis; } /* Mozill ...

  10. jQuery1.11源码分析(8)-----jQuery调用Sizzle引擎的相关API

    之所以把这部分放在这里,是因为这里用到了一些基本API,前一篇介绍过后才能使用. //jQuery通过find方法调用Sizzle引擎 //jQuery通过find方法调用Sizzle引擎 jQuer ...