// 创建CompilingClassLoader
CompilingClassLoader ccl = new CompilingClassLoader();
// 通过CCL加载主函数类。
Class clas = ccl.loadClass( progClass );
// 利用反射调用它的主函数和传递参数。
// 产生一个代表主函数的参数类型的类对象。
Class mainArgType[] = { (new String[0]).getClass() };
// 在类中找到标准的主函数。
Method main = clas.getMethod( "main", mainArgType );
// 创建参数列表 -在这里,是一个字符串数组。
Object argsArray[] = { progArgs };
// 调用主函数。
main.invoke( null, argsArray );
}
}
Foo.java
以下是文件Foo.java内容
public class Foo
{
static public void main( String args[] ) throws Exception {
System.out.println( "foo! "+args[0]+" "+args[1] );
new Bar( args[0], args[1] );
}
}
Bar.java
以下是文件Bar.java内容
import baz.*;
public class Bar
{
public Bar( String a, String b ) {
System.out.println( "bar! "+a+" "+b );
new Baz( a, b );
try {
Class booClass = Class.forName( "Boo" );
Object boo = booClass.newInstance();
} catch( Exception e ) {
e.printStackTrace();
}
}
}
baz/Baz.java
以下是文件baz/Baz.java内容
package baz;
public class Baz
{
public Baz( String a, String b ) {
System.out.println( "baz! "+a+" "+b );
}
}
Boo.java
以下是文件Boo.java内容
public class Boo
{
public Boo() {
System.out.println( "Boo!" );
}
}
第七部分. 总结
总结
通过本文你是否意识到,创建自定义类加载器可以让你深入到Java虚拟机的内部。你可以从任何资源加载类文件,或者动态的生成它,这样你就可以通过扩展这些功能做很多你感兴趣的事,还能完成一些强大的功能。
关于ClassLoader的其它话题
就像本文开头说的,自定义类加载器在Java嵌入式浏览器和小应用程序浏览器中起着重要的作用。下面给出类加载器的其它功能。
* 安全: 自定义的类加载器可以在把这个类交给Java虚拟机之前检查它是否有正确的数字签名。你也可以自己创建一个"沙箱"来阻止对某些方法的调用,这是通过检查源代码,阻止该类对沙箱之外的操作来实现的。
* 加密:通过自定义类加载器可以动态的解码,所有你的类文件就无法通过反编译被查看到代码。用户需要密码才能运行程序,这个密码用来对代码解密。
* 存档:你是否需要将你的代码以某种格式或者压缩形式发布吗?自定义ClassLoader可以从你想要的任何资源中生成字节码文件。
* 自提取程序:可以把整个应用程序编译到一个可执行的类文件中,这个文件包括压缩过或者加密过的数据,有了内部类加载器,当程序运行的时候,他把自己解包到内存-不需要事前安装。
* 动态生成:可以动态的生成那些被引用的类-整个程序需要用的类都可以动态的生成然后交给Java虚拟机。
责任编辑:小草