java_基础——用代码编译.java文件+加载class文件

【简单编译的流程】

  

package com.zjm.www.test;

import java.io.IOException;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class Test {

    public static void main(String[] args) {

          // 获取.java文件路径
          String fileName = System.getProperty("user.dir")+
            "\\src\\com\\zjm\\www\\test\\TankTimeProxy.java";

          /**
           * ToolProvider类:该类是为查找工具提供者提供方法,例如,编译器的提供者。)
           * getSystemJavaCompiler:获取此平台提供的 Java™ 编程语言编译器。
           */
          JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

          /**
            * getStandardFileManager: 为此工具获取一个标准文件管理器实现的新实例。
            * 参数:
            *    diagnosticListener - 用于非致命诊断信息的诊断侦听器;如果为 null,则使用编译器的默认方法来报告诊断信息
            *    locale - 格式化诊断信息时要应用的语言环境;如果为 null,则使用默认语言环境。
            *    charset - 用于解码字节的字符集;如果为 null,则使用平台默认的字符集
            * 返回:
            *    标准文件管理器
            *
           */
          StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null,null,null);

          /**
               * getJavaFileObjects:获取表示给定文件的文件对象。
               * 参数:
            *    files - 文件数组
            * 返回:
            *    文件对象列表
           */
          Iterable units = fileMgr.getJavaFileObjects(fileName);

          /**
               * getTask:使用给定组件和参数创建编译任务的 future
               * 参数:
            *    out - 用于来自编译器的其他输出的 Writer;如果为 null,则使用 System.err
            *    fileManager - 文件管理器;如果为 null,则使用编译器的标准文件管理器
            *    diagnosticListener - 诊断侦听器;如果为 null,则使用编译器的默认方法报告诊断信息
            *    options - 编译器选项;null 表示没有选项
            *    classes - 类名称(用于注释处理),null 表示没有类名称
            *    compilationUnits - 要编译的编译单元;null 表示没有编译单元
            * 返回:
            *    表示编译的对象
           */
          CompilationTask t = compiler.getTask(null,null,null,null,null,units);//编译任务

          //  开始编译
          t.call();

          //  关闭“java编译器”
          try {
            fileMgr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

【其中的TankTimeProxy类】

package com.zjm.www.test;

public class TankTimeProxy {

    public TankTimeProxy(){
        System.out.println("hello TankTimeProxy");
    }
}

注:默认编译后的class文件与该java文件在同一个文件夹下。

 

  【加载class文件】

package com.zjm.www.test;

import java.net.URL;
import java.net.URLClassLoader;

public class Test2 {

    public static void main(String[] args) throws Exception {
          //1 去那个路劲下找这个类,默认是bin下面的classpath,因为自动编译后的class文件默认放在那里
          URL[] urls = new URL[] {new URL("file:/"+System.getProperty("user.dir")+"/src/")};

          //2 去urls里面去找class
          URLClassLoader ul = new URLClassLoader(urls);

          //3 load哪个类,写全类名。
          Class c = ul.loadClass("com.zjm.www.test.TankTimeProxy");

          // 打印:hello TankTimeProxy 即代表成功
          Object o = c.newInstance();
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值