今天自己写了一个Java的运行时加载类。
目录结构如下:
总共三个java文件,都很简单,代码如下:
Main.java:
import com.IHello; public class Main{ public static void main(String[] args){ try { Thread.sleep(10000); Class hellClass = Class.forName("com.Hello"); IHello o = (IHello)hellClass.newInstance(); System.out.println(o.hello()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
IHello.java
package com; public interface IHello { public String hello(); }
Hello.java
package com; public class Hello implements IHello{ public String hello(){ return "hello I'm dynamic"; } }
首先在javatest目录下,执行
javac Main.java
如此会把Main.java和 IHello.java 编译成相应的class
然后再执行
javac com/Hello.java
如此把剩下的Hello.java也编译成相应的class
编译完成后的目录如下:
可以看到三个class文件生成了,然后我们执行Main.class,可以看到程序等待十秒然后打印了正确的字符串。
下边是步骤关键:
1、把Hello.class文件剪切走,然后执行Main.class,发现报错,找不到类。
2、先执行Main.class,然后等个一秒钟,把Hello.class复制到com目录下,再等一会,发现打印正常。
通过上面我们得出了java的Class.forName果然是动态加载class文件的,等到执行到Class.forName时,再去相应的包路径下找相应的class文件,然后再加载到虚拟机中。
完毕。