Class.forName(“类的全称”);
不仅表示类的类类型,还代表了动态加载类
请大家区分编译、运行
编译时刻加载类时静态加载类、运行时刻加载类时动态加载类
编写一个Office.java文件,在类中创建2个不存在的对象Word和Excel,
public class Office {public static void main(String[] args) {//new 创建对象 是静态加载类,//在编译时刻就需要加载所有的可能是用到的类//动态加载可以解决此问题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类,提供start方法,编译Word.java
Word.java
class Word{public static void start(){System.out.println("word..start");}
}
编译
javac Office.java
Word
类不抛出异常了,Excel类不存在,仍然不能进行编译。
从上面可以看出,静态加载类,在编译时如果有一个类不存在,就会报错。
动态加载类可以解决此问题,也就是在编译时,不报错,在运行时,使用到具体类,如果该类不存在,就会报错
动态加载类
创建一个标准接口
IOfficeAndWord.java
public interface IOfficeAndWord {public void start();
}
Word和Excel类都实现这个接口的方法
Word.java
public class Word implements IOfficeAndWord {@Overridepublic void start() {System.out.println("word..start");}
}
Excel.java
public class Excel implements IOfficeAndWord {@Overridepublic void start() {System.out.println("excel..start");}
}
public class OfficeBetter {public static void main(String[] args) {//动态加载类,在运行时时刻加载try {Class c = Class.forName(args[0]);//通过类类型,创建该类对象,返回类型为该对象的类型IOfficeAndWord oaw = (IOfficeAndWord) c.newInstance();oaw.start();} catch (Exception e) {e.printStackTrace();}}
}
依次编译这几个类,
javac OfficeBetter.java
javac Word.java
javac Excel.java
运行OfficeBetter 类中的Word/Excel的方法
java OfficeBetter Word
java OfficeBetter Excel
如果,Excel不实现OfficeBetter 接口的方法,运行时会抛出异常