java_基础——用代码编译.java文件+加载class文件
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();
}
}
java_基础——用代码编译.java文件+加载class文件相关教程
Python基础教程之Python 字典(Dictionary)
Python基础教程之Python 字典(Dictionary) 目录 Python Dictionary(字典) 与列表区别(list) 注意事项 创建字典 简单操作 内置函数 注意 Python Dictionary(字典) 字典(dictionary)是Python中另一个非常有用的内置数据类型。 与列表区别(list) 列表
java第十六天
java第十六天 复习 面向对象的三大特性: 封装:private get/set 继承:extends 抽取共性 实现代码复用 多态:1.存在继承关系 2.重写 3.父类引用指向子类 实现形式: 普通父类 抽象类 接口 java常用接口: Comparable public interface ComparableT { public
Java中的不可变集合与使用场景
Java中的不可变集合与使用场景 Jdk中的Collections.unmodifiable与使用 场景:你去购物时被人偷偷往你购物车里丢了东西 解决方法:不可变集合:Collections.unmodifiableXXX 需求: 我们的需求是只有在创建对象(学生)时,才能设定ta的课程,所以我们在设计类
Flink代码及ui界面应用
Flink代码及ui界面应用 文章目录 Flink和Spark各自优劣 底层机制 Spark Flink 运用 支持语言 Flink运行代码 maven配置 source部分transform模块 sink模块 执行 1、命令行执行 2、Flink web ui配置 job执行日志 task manager日志 Flink和Spark各自优劣 底层机
Udesk WebIM插件客户身份认证(一、Java签名篇)
Udesk WebIM插件客户身份认证(一、Java签名篇) 作者:张振琦 网站登录用户通过web im进行聊天对话时,可以将客户信息通过链接转给Udesk,这样客服在与客户对话时,就可以直接查看客户信息。通过客户信息辅助组件也可以进一步了解此客户的订单等其他信息。
Java多线程高并发之ThreadPool
Java多线程高并发之ThreadPool 前边我们讲述了:Java多线程高并发之基础概念篇、Java多线程高并发之详解JUC同步工具 分别从以下几个方面了解线程的概念及如何使用: 1、线程是什么?为什么需要多线程?Java如何实现多线程? 2、Java对多线程的基础操作:线程
Java时区时间转换
Java时区时间转换 开发中,我们可能需要将时区类的时间转换成我们能够理解的且表示正常的date类型(这些场景在数据库时间字段比较常见,如mongo和es,他们储存的时候时间是0时区表示,而我们处在东八区,时间差为8小时),实例如下: String time = 2020-09-27T03:57:3
[Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治
[Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归] 【问题描述】[中等] 【解答思路】 copyOfRange class Solution { public TreeNode constructFromPrePost(int[] pre, int[] post) { if(pre==null || pre.length==0) { return null; } r