概述
在java中,Class.forName(“类的全名”)不仅代表了类的类类型,还代表了动态加载类
注:编译时刻加载啊类是静态加载类、运行时刻加载类是动态加载类
现在我们通过一个简单地例子来理解静态加载和动态加载。
- 新建一个文件夹,命名随意,我命名为reflect,用文本编辑器(记事本或其他,我使用sublime)在其中创建一个java文件,文件中写入如下代码
class Office{
public static void main(String[] args){
//此处args[0]为命令行参数
if ("Word" . equals(args[0])) {
Word w = new Word();
w.start();
}
if ("Excel" . equals(args[0])) {
Excel e = new Excel();
e.start();
}
}
}
在此文件夹打开命令行,输入javac Office.java,结果如下图
显然,由于没有写Word类和Excel类,所以报错了。
- 接着在同一目录下,分别新建Word.java文件,代码如下
Word.java文件
class Word{
public static void start(){
System.out.println("Word");
}
}
然后我们在命令行先编译Word类,再编译Office,发现错误变少了,如下图
由于Excel类不存在,那Office.java编译就会出错,即使Word.java已经存在,但由于Excel的原因,Office.java无法使用
注:new对象是静态加载类,在加载时刻就需要加载所有可能使用到的类,这便是运行时加载
3. 在同一目录下新建 OfficeBetter.java文件,代码如下
class OfficeBetter{
public static void main(String[] args){
try{
Class c = Class.forName(args[0]);
}catch(Exception e){
e.printStackTrace();
}
}
}
在这个文件中我们使用Class.forName()实现动态加载类,在运行时刻加载,所以现在通过命令行编译OfficeBetter.java进行编译,即使Excel类不存在,也不会报错,同时,我们运行OfficeBetter并传入参数Excel,这时候由于不存在Excel类才会出现ClassNotFoundException 如下图
4. 现在我们要使用 c 来创建 该类的对象,并调用它的方法,同时为了可以同时兼顾到可以创建Word和Excel的对象,我们使用一个接口OfficeAble来实现。
OfficeAble.java文件
Interface OfficeAble{
public void start();
}
OfficeBetter.java文件
class OfficeBetter implements OfficeAble{
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();
}
}
}
现在我们就可以编译运行OfficeWord.java文件了,同时我们也可以创建Excel.java文件,让其动态加载Excel.java文件和Word.java文件
Word.java
class Word implements OfficeAble{
public static void start(){
System.out.println("Excel");
}
}
Excel.java
class Excel implements OfficeAble{
public static void start(){
System.out.println("Excel");
}
}
现在我们在命令行动态加载Word和Excel,如下图
看图中我们已经可以动态加载类了,通过动态加载,选择性运行Word和Excel类。
最后
以上就是鲤鱼绿草为你收集整理的Java反射(二)----- 动态加载类的全部内容,希望文章能够帮你解决Java反射(二)----- 动态加载类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复