zoukankan      html  css  js  c++  java
  • Java动态编译一个简单的例子(我转载的,但是经过修定,可以在Eclipse下运行) 规格严格

    先不说别的,在Eclipse下运行的代码如下
    代码

    package com.test;

    import java.io.
    *;
    import java.lang.reflect.
    *;
    import java.io.File;

    /**
     * @author DiZhuang com.test CompileTest.java  
    */
    public class CompileTest {
        
    static com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();

        @SuppressWarnings(
    "static-access")
        
    public static void main(String[] args) {
            System.
    out.println("User Dir is " + System.getProperty("user.dir")
                    
    + "\\src\\com\\test");
            
    try {
                File file 
    = File.createTempFile("RunTime"".java"new File(System
                        .getProperty(
    "user.dir")
                        
    + "\\src\\com\\test"));
                String filename 
    = file.getName();
                System.
    out.println("tempFile name is " + filename);
                String classname 
    = filename.substring(0, filename.indexOf('.'));
                System.
    out.println("class name is " + classname);
                PrintWriter 
    out = new PrintWriter(new FileOutputStream(file));
                
    out.println("package com.test;");
                
    out.println("public class " + classname + "{");
                
    out.println("public static void main(String[] args){");
                
    out.println("System.out.println(\"Yes!\");");
                
    out.println("}}");
                
    out.flush();
                
    out.close();
                String[] arg 
    = new String[] { "-d",
                        System.getProperty(
    "user.dir"+ "\\bin",
                        System.getProperty(
    "user.dir"+ "\\src\\com\\test\\"
                                
    + filename };
                
    int status = javac.compile(arg);
                System.
    out.println("compile status is " + status);
                Class
    <?> cls = Class.forName("com.test."+classname);
                Method main 
    = cls.getMethod("main"new Class[] { String[].class });
                main.invoke(
    nullnew Object[] { new String[0] });
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }

    按照网上的例子改写了一下,出现问题如下:

    1 说找不到com.sun.tools.javac.Main ,主要是在Eclipse下加载了自己的JRE吧,我是这么认为的,解决办法:将别的JDK下面的tools.jar装入Eclipse类路径下(个人认为这是我们写test程序最省事的办法)

    2 Eclipse下编译后的代码在bin文件夹下面,并且一般都有包名,所以编译和运行时候,千万别忘记路径,注意:这个我们在JDK下运行是不一样。

    修改如下:

    String[] arg = new String[] { "-d",
                        System.getProperty(
    "user.dir"+ "\\bin",
                        System.getProperty(
    "user.dir"+ "\\src\\com\\test\\"
                                
    + filename };
    -d 指明编译后类的存放位置

     Class<?> cls = Class.forName("com.test."+classname);
    指明类名

  • 相关阅读:
    TCP的发送缓冲区和接收缓冲区
    【 Linux 】单台服务器上并发TCP连接数(转)
    Mosquitto----服务器日志
    Mqtt ----心跳机制
    class文件无论是32位还是64位jdk编译出来的,都可以通用
    启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决-及eclipse版本查看
    Ant编译提示“Unsupported major.minor version 52.0”
    HanLP自然语言处理包介绍
    Lazarus安装使用
    Java中字符串转为16进制表示
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/1639301.html
Copyright © 2011-2022 走看看