【本文介绍】  

  本文不是深入理解和使用java编译器,只是在代码里编译.java文件的helloWorld。这种技术还是蛮有意思的,说不定在将来的某些只能化项目会运用到!^_^

  【简单编译的流程】

  

  【java代码】

 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();
}
}

  为了测试,我们在TankTimeProxy的构造方法中打印 "hello TankTimeProxy" ,如果加载类成功,那么当我们使用 newInstance() 方法时,该类的构造器将会被调用,从而打印"hello TankTimeProxy" , 实际中,确实打印出 "hello TankTimeProxy"。

java_基础——用代码编译.java文件+加载class文件的更多相关文章

  1. java动态加载jar文件

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, Invo ...

  2. xml文件 加载properties文件的两种方法与注意事项

    1.遇到的问题: 配置redisSpringContext.xml 时,遇到 properties加载失败,提示BeanDefinitionStoreException  和   java.lang. ...

  3. [改善Java代码]使用forName动态加载类文件

    动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...

  4. JAVA 中加载属性文件的4种方法

    小总结 : 这个集合属性可以反序列化, 把持久化数据读出来, 输入流中放入要操作的文件! p.load加载这个输入流! p.getProperty( key) 根据这个键获得值! 补充 : web工程 ...

  5. java中加载xml文件方法

    this.getclass().getclassloader().getresourceasstream(String file); 可以加载文件,比如xml.

  6. Java动态加载属性文件.properties

    当我们使用如下语句加载.properties时: ClassLoader classLoader = this.getClass().getClassLoader(); Properties prop ...

  7. Java加载资源文件的两种方法

    处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...

  8. 动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数

    动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数, 在很多场景下,我们需要在动态加载JS文件的时候,根据加载的状态来进行后续的操作,需要在JS加载成功后,执行另一方法,这个方法是依托在加 ...

  9. 二十:jinja2之加载静态文件

    静态文件: flask默认指定的静态文件路径为根目录下的static,可以自定义路径,并指定,使用url_for('文件夹', filename='文件名')引用 加载css文件 加载js文件 其他文 ...

随机推荐

  1. 模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace

    Cyclic Nacklace Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3746 Mean: 给你一个字符串,让你在后面加尽 ...

  2. 在Asp.net中为图像加入水印信息

    using System.Drawing; using System.IO; using System.Drawing.Imaging; private void AddTextToImg(strin ...

  3. Matlab 实现神经网络实例

    % Matlab实现简单BP神经网络 % http://blog.csdn.net/zjccoder/article/details/40713147 : %样本个数 xx(i)=*pi*(i-)/; ...

  4. Ubuntu libpng png++安装

    http://blog.csdn.net/xiaozhun07/article/details/49865785 png使用过程问题小结: (1) libpng “png_set_longjmp_fn ...

  5. Abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性

    Abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性. Abstract虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型. Final和abstrac ...

  6. 滚动到指定位置js

    function mScroll(id){ $("html,body").stop(true); $(); }

  7. 采用std::thread 替换 openmp

    内容转换的,具体详见博客:https://cloud.tencent.com/developer/article/1094617 及对应的code:https://github.com/cpuimag ...

  8. 如何在AWS中为自己的S3托管站点添加SSL/TSL证书(https)

    概要 利用AWS的S3服务托管静态网站后,如何将自己的域名与该站点绑定,并为此域名提供SSL/TSL证书(https). 面向人群 已经掌握如何利用S3服务托管静态网站. 已经拥有自己的域名. 希望为 ...

  9. php实现简单的权限管理

    今天主要来实现一个权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样,首先先看下数据库 总共有5张表,qx_user,qx_rules和qx_jues ...

  10. iphone中点击input不能选中input中的内容

    点击一个input,通过它的click事件选中这个input框中的内容,这个用jquery挺好实现的,但是有一个问题,在PC端和android手机上都可以让功能正常实现,在iphone上就没有效果了, ...