2-1 Java动态加载类
来源:互联网 发布:linux命令创建多层目录 编辑:程序博客网 时间:2024/06/05 01:57
Class.forName(“类的全称”)
- 不仅表示了类的类类型,还代表了动态加载类
- 需要区分编译、运行
- 编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
使用记事本工具编写一下代码:
class Offic { public static void main(String[] args) { if("Word".equals(args[0])) { Word w = new Word(); w.start(); } if("Excel".equals(args[0])) { Excel e = new Excel(); e.start(); } }}
在cmd中使用javac命令编译程序
不能通过编译。此时Word类和Excel类都不存在。但是Word类和Excel类一定用吗?
现在创建Word类:
class Word{ public static void start() { System.out.println("word...start..."); }}
javac Word.java
javac Office.java
现在只有两个错了,Excel类不存在。
问题是,Word类已经存在了。
假设现在就要用Word类,也不能使用。
原因是,现在的程序做的是静态加载。在编译时刻就需要加载所有的可能使用到的类。
现在希望Word存在Word类就能用。用Excel类的时候, 在告诉我Excel类是找不到的。
如果将来这个程序有很多个功能,只要一个功能有问题,其他的功能就都用不了。这就是编译时加载导致的。new 创建对象都是静态加载类。
我们想要做到的是,主类中用到哪个类就加载哪个类,不用的时候不加载。
通过动态加载类,可以解决该问题。
如何动态加载类呢?
class OfficeBetter{ public static void main(String[] args) { try{ //动态加载类,在运行时刻 Class c = Class.forName(args[0]);//args[0]就是你用命令行编译运行java程序时,传入的第一个参数 } catch(Exception e) { e.printStackTrace(); } }}
现在编译不会报错,只有把具体的类传入OfficeBetter类时,才会可能报错。
我们可以看到,编译时没问题,只有在运行时,传入arg[0]具体类名时,才会判断是否正确。
接下来,可以通过类类型,创建该类对象。c.newInstance();然后往具体的类需要做强制转换。但如果直接强转成Word或Excel,这种写死的方式都不好。这里让Word和Excel统一实现一个接口,使用面向接口编程的思想。
class OfficeBetter{ public static void main(String[] args) { try{ Class c = Class.forName(args[0]); OfficeAble oa = (OfficeAble)c.newInstance(); oa.start(); } catch(Exception e) { e.printStackTrace(); } }}
public interface OfficeAble{ public void start();}
class Word implements OfficeAble{ public void start() { System.out.println("word...start..."); }}
现在想要Excel了,只需把Excel类加上来,并不需要重新编译OfficeBetter这个类。只需要动态的加新的功能。相当于QQ的在线升级,前面的版本不需要删除,不需要重新编译,只需要动态加载新的东西。
class Excel implements OfficeAble{ public void start() { System.out.println("excel...start..."); }}
- 2-1 Java动态加载类
- java动态加载类
- java 动态加载类
- Java 动态加载类
- java动态加载类
- Java动态类加载
- Java动态类加载
- Java动态类加载
- java动态加载类
- java 动态加载类
- JAVA动态加载类
- Java动态加载类
- java动态加载类
- 【java】动态加载类-URLClassLoader
- 类加载--- JAVA动态性
- java类的动态加载
- java之动态加载类
- java反射:动态加载类
- Scala函数式编程(六)——闭包
- 一致性哈希算法
- AttributeError: module 'cv2' has no attribute 'SIFT'
- c++实现引用计数智能指针
- Qt笔记-MSVC报newline in constant(即奇数个中文汉字的问题)
- 2-1 Java动态加载类
- pip源-PyPI使用国内源
- 第一个docker测试容器(交互式)
- Win7+VS2013+OpenCV3.0.0详细配置
- 图像的卷积
- 指定CentOS7虚拟机IP
- linux-基础-进程通讯(一)-管道通信/信号/内存共享
- asp.net c# 异步日志通用类(3)
- 简单文件输出函数