自定义运行器以及编译器
来源:互联网 发布:医学数据分析公司 编辑:程序博客网 时间:2024/06/06 06:34
1、编译:javac MyRunner.java
2、动态编译运行:java MyRunner Person prt
3、代码演示如下:
import java.io.*;import java.lang.reflect.*;/** * 自定义运行器,继承ClassLoad类 * @author tiger * @Date 2017年8月3日 */public class MyRunner extends ClassLoader{/** * 测试类 * 1、编译:javac MyRunner.java * 2、动态编译运行:java MyRunner Person prt * @param args * @throws Exception */public static void main(String[] args) throws Exception {//获取类名String className = args[0];//获取方法名String mName = args[1];//首先编译MyCompiler compiler = new MyCompiler();compiler.doCompile(className);//延时一下确保编译已经完成Thread.sleep(5000);//运行MyRunner r = new MyRunner();Class> clazz = r.findClass(className);r.running(clazz, mName);}/** * 从编译好的.class文件中获取字节码数据 * @param name * @return * @throws IOException */public byte[] getRawsData(String name) throws IOException{InputStream is = new FileInputStream(name+".class");byte[] buf = new byte[is.available()];is.read(buf);is.close();return buf;}/** * 重写父类 ClassLoader 的 findClass 方法 */@Overrideprotected Class> findClass( String name )throws ClassNotFoundException{byte[] raws = null;try {raws = getRawsData( name );} catch (IOException e) {e.printStackTrace();} //拿到字节码的原数据//调用父类 ----> ClassLoader 的 defineClass 来获取一个字节码对象Class> clazz = defineClass( name, raws, 0, raws.length );//返回加载到的 "字节码对象"return clazz; }/** * 运行编译好的类,执行相应的静态方法 * @param clzz 类的字节码 * @param mName 运行时执行的方法名 * @throws Exception */public void running(Class> clazz,String mName) throws Exception{Method m = clazz.getMethod(mName);//执行传入的方法m.invoke(null);}}import java.io.IOException;/** * 我的编译器 * @author tiger * @Date 2017年8月3日 */public class MyCompiler {public int doCompile( String file ) throws IOException{Process p = Runtime.getRuntime().exec( "javac "+ file+".java");try{p.waitFor(); //等这一个程序的执行完成(阻塞)}catch( InterruptedException e ){e.printStackTrace();}return p.exitValue();}}package com.reflect.compile;/** * 自定义运行器以及编译器 * @author tiger * @Date 2017年8月3日 */public class Person {public void prt(){System.out.println("Person.prt()");}{System.out.println("Person非静态person 初始化");}static{System.out.println("Person静态 person 初始化");}}
阅读全文
1 0
- 自定义运行器以及编译器
- 编译器常量、运行时常量以及静态块执行
- 在Windows下使用命令提示符以及VS提供的CL编译器编译运行C/C++
- C++ 中关于 iostream、源文件命名约定以及运行 GNU (微软)编译器的几点说明
- eclipse下添加GCC编译器的编译链接库以及程序运行参数方法
- 查看编译器自定义宏
- #pragma 编译器自定义参数
- 开发板上如何自定义开机运行脚本以及应用程序
- maven 运行scalatest以及elastic search 自定义id
- cocos2dx-3.11 使用创建Lua项目以及运行自定义场景
- Android自定义启动界面以及初次运行界面
- VS2015环境搭建以及QT编译器和调试器配置
- 函数,数据,编译器运行期
- 多态 编译器&运行期绑定
- sublime编译器运行java程序
- 尾递归以及编译器优化
- 编译器 以及 纯虚函数
- JVM类型以及编译器模式
- [py]django实现url跳转
- JS常用对象9
- 粒子群算法实战分享-附原版动画PPT(技术分享也可以文艺范?)
- 脚本:获取CSDN文章的访问量
- Redis数据类型
- 自定义运行器以及编译器
- Sdjpx Is Happy HDU
- TCP之性能优化避免慢启动
- 设计模式之--单例模式(Singleton)的常见应用场景
- Matrix Chain Multiplication
- 如何快速定位自己热爱的工作
- Mongdb和mysql的一些比较
- 49.字符串分类
- 递归方法计算一个中缀表达式的值