Java运行时编译和加载类

1、ant javac 的原理
sun.tools包下包含了很多命令的java实现,javac的使用见下例:
//sun.tools.javac.Main 该类负责实现javac命令,推荐使用反射方式创建该类实例(ant中就是用的反射)。
sun.tools.javac.Main compiler =
                    new sun.tools.javac.Main(System.err, "javac");
//编译后的class文件保存的地址
File dest=new File("classes");
dest.mkdir();
//开始编译,参数是执行javac命令是后面所根的参数,注意javac命令后参数以空格分隔,在此使用一个字符串数组保存。
compiler.compile(new String[]{"-classpath",".","-sourcepath",new File("temp").getAbsolutePath(),"-d","classes",""});

2、动态加载类
通过上面的方法动态的编译java类,在程序中使用的时候还需要进行加载。
所有的java类都是通过ClassLoader的对象来加载。在此可以使用其子类URLClassLoader加载:
//使用当前项目的路径为根路径
File baseDir=new File("");
URL url=new URL("file:/"+baseDir.getAbsolutePath()+"/classes/");
//通过指定class文件的路径告诉ClassLoader从何加载类
URLClassLoader loader=URLClassLoader.newInstance(new URL[]{url},ClassLoader.getSystemClassLoader());
//加载类,返回该类得Class实例。效果同Class.forName()。
clazz=loader.loadClass("org.jigger.Simple");

注意:使用自定义ClassLoader,无法使用Class.forName获取类对象,即无法使用系统类加载器加载该类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值