我是靠谱客的博主 着急机器猫,最近开发中收集的这篇文章主要介绍Java反射(二)-Java动态加载类,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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...");
}
}

这里写图片描述

最后

以上就是着急机器猫为你收集整理的Java反射(二)-Java动态加载类的全部内容,希望文章能够帮你解决Java反射(二)-Java动态加载类所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部