Java动态加载类示例详解

 更新时间:2021年02月21日 14:01:28   作者:占位符号  
这篇文章主要给大家介绍了关于Java动态加载类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在讲解动态加载类之前呢,我们先弄清楚为什么要动态加载类,静态加载不行吗?我们可以看下面的实例:

我在文件夹里写了Office.java 类和 Word.java类,如下:

Office.java

class Office{
	public static void main(String[] args){
		if(args[0].equals("Word")){
			Word w = new Word();
			w.start();
		}
		if(args[0].equals("Excel")){
			Excel e = new Excel();
			e.start();
		}
	}
}

Word.java

class Word{
	public void start(){
		System.out.println("Word Start");
	}
}

此时我们编译一下Office.java 文件:

编译会报错,这当然没问题,因为确实没有写Excel.java类。

但是这个Excel类我们一定会用到吗?如果这个Excel类需要很久才能写出来,在此我们也不能使用其他功能吗?后面如果一个类出问题了,这个系统是不是就瘫痪了?

所以这就体现出动态加载类的好处了,动态加载类是按需加载的,你需要什么类,就加载什么类,一个类的状态,不会影响到另一个类的使用。

所以我们可以将Office类改造如下:

class Office{
	public static void main(String[] args){
		try{
			Class c = Class.forName(args[0]);
			Word w = (Word)c.newInstance();
			w.start();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		
	}
}

虽然我们还是没有写Excel类,但此时我们再编译Office.java文件,编译通过;

运行一下:

成功按照我们预想的结果运行,这样Word类就可以单独运行。

但是这样还是不够规范,因为现在只能加载Word类类型的类文件,为了使程序有更好的扩展性,我们添加一个接口,只有让所有的功能类实现该接口即可。完善如下:

OfficeAble.java

interface OfficeAble{
	public void start();
}

Office.java

class Office{
	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();
		}
		
	}
}

Word.java

class Word implements OfficeAble{
	public void start(){
		System.out.println("Word Start");
	}
}

这样改造之后,我后面要添加一个Excel类,乃至添加其他的类,只需要实现OfficeAble接口就可以了,不需要改动Office这个类和其他的功能类,扩展性很强,这就是动态加载的优势。

总结

到此这篇关于Java动态加载类的文章就介绍到这了,更多相关Java动态加载类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java反射与Fastjson的危险反序列化详解

    Java反射与Fastjson的危险反序列化详解

    在 Java 中,Computer.class是一个引用,它表示了 Computer 的字节码对象(Class对象),这个对象被广泛应用于反射、序列化等操作中,那么为什么 parseObject 需要这个引用呢,带着这个问题我们一起通过本文学习下吧
    2024-07-07
  • RocketMQ NameServer 核心源码解析

    RocketMQ NameServer 核心源码解析

    这篇文章主要为大家介绍了RocketMQ NameServer 核心源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 一篇文章带你搞懂Java线程池实现原理

    一篇文章带你搞懂Java线程池实现原理

    线程池无论是工作还是面试都是必备的技能,但是很多人对于线程池的实现原理却一知半解,并不了解线程池内部的工作原理,今天就带大家一块剖析线程池底层实现原理
    2022-11-11
  • java编程中拷贝数组的方式及相关问题分析

    java编程中拷贝数组的方式及相关问题分析

    这篇文章主要介绍了java编程中拷贝数组的方式及相关问题分析,分享了Java中数组复制的四种方式,其次对二维数组的简单使用有一段代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Springboot引用外部配置文件的方法步骤

    Springboot引用外部配置文件的方法步骤

    这篇文章主要介绍了Springboot引用外部配置文件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解JAVA流程控制语句

    详解JAVA流程控制语句

    这篇文章主要介绍了Java中的流程控制语句,循环等语句是Java编程中流程控制的基础,需要的朋友可以参考下
    2017-04-04
  • Java调用ChatGPT(基于SpringBoot和Vue)实现可连续对话和流式输出的ChatGPT API

    Java调用ChatGPT(基于SpringBoot和Vue)实现可连续对话和流式输出的ChatGPT API

    这篇文章主要介绍了Java调用ChatGPT(基于SpringBoot和Vue),实现可连续对话和流式输出的ChatGPT API(可自定义实现AI助手),文中代码示例介绍的非常详细,感兴趣的朋友可以参考下
    2023-04-04
  • Java InheritableThreadLocal使用示例详解

    Java InheritableThreadLocal使用示例详解

    InheritableThreadLocal继承了ThreadLocal,此类扩展了ThreadLocal以提供从父线程到子线程的值的继承:当创建子线程时,子线程接收父线程具有的所有可继承线程局部变量的初始值。 通常子线程的值与父线程的值是一致的
    2022-09-09
  • mybatis trim标签的使用详解

    mybatis trim标签的使用详解

    这篇文章主要介绍了mybatis trim标签的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • mybatis分页效果实现代码

    mybatis分页效果实现代码

    这篇文章主要为大家详细介绍了mybatis分页效果的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04

最新评论