不过这个文件里面有提到一些改进的地方...
目前我的水平还不够,希望各位高手加以改进
1 . 不需要生成临时文件...源代码注释有说
2 . 返回值的问题...
3 . 导入包的问题...

解决方案 »

  1.   


    import java.io.*;
    import java.net.*;
    import java.lang.reflect.*;
    public class Eval
    {
        public static void main(String[] args)throws Exception
        {
             Object rval = eval("System.out.println(\"555\");return 5;");
             System.out.println(rval);
        }
        public static Object eval(String str)throws Exception
        { 
             //生成Java源文件 
             StringBuilder s = new StringBuilder("public class Temp{"); 
             s.append("        public Object rt(){"); 
             s.append("                " + str); 
             s.append("        }"); 
             s.append("}"); 
             //在当前目录生成Java源文件
             File f = new File("Temp.java"); 
             PrintWriter pw = new PrintWriter(new FileWriter(f)); 
             pw.println(s.toString()); 
             pw.close(); 
             //动态编译(此处可直接编译内存中的Java源码,二进制码也放在内存中)
             com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main(); 
             String[] cpargs = new String[] {"-d", "." ,"Temp.java"}; 
             //动态编译
             int status = javac.compile(cpargs); 
             if(status != 0 )
             { 
                     System.out.println("您给的Java代码有错!"); 
                     return null; 
             } 
             //创建一个URL数组
             URL[] urls = {new URL("file:Temp.class")};
             //以默认的ClassLoader作为父ClassLoader,创建URLClassLoader
             URLClassLoader myClassLoader = new URLClassLoader(urls);
             //加载Temp类(如果要加载内存中的class文件-二进制码,需要自己写类加载器)
             Class clazz = myClassLoader.loadClass("Temp"); 
             //获取rt方法
             Method rt = clazz.getMethod("rt"); 
             //动态调用rt方法
             return rt.invoke(clazz.newInstance()); 
        } 
    }
      

  2.   

    import java.io.*;
    import java.net.*;
    import java.lang.reflect.*;
    public class Eval
    {
        public static void main(String[] args)throws Exception
        {
             Object rval = eval("System.out.println(\"555\");return 5;");
             System.out.println(rval);
        }
        public static Object eval(String str)throws Exception
        { 
             //生成Java源文件 
             StringBuilder s = new StringBuilder("public class Temp{"); 
             s.append("        public Object rt(){"); 
             s.append("                " + str); 
             s.append("        }"); 
             s.append("}"); 
             //在当前目录生成Java源文件
             File f = new File("Temp.java"); 
             PrintWriter pw = new PrintWriter(new FileWriter(f)); 
             pw.println(s.toString()); 
             pw.close(); 
             //动态编译(此处可直接编译内存中的Java源码,二进制码也放在内存中)
             com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main(); 
             String[] cpargs = new String[] {"-d", "." ,"Temp.java"}; 
             //动态编译
             int status = javac.compile(cpargs); 
             if(status != 0 )
             { 
                     System.out.println("您给的Java代码有错!"); 
                     return null; 
             } 
             //创建一个URL数组
             URL[] urls = {new URL("file:Temp.class")};
             //以默认的ClassLoader作为父ClassLoader,创建URLClassLoader
             URLClassLoader myClassLoader = new URLClassLoader(urls);
             //加载Temp类(如果要加载内存中的class文件-二进制码,需要自己写类加载器)
             Class clazz = myClassLoader.loadClass("Temp"); 
             //获取rt方法
             Method rt = clazz.getMethod("rt"); 
             //动态调用rt方法
             return rt.invoke(clazz.newInstance()); 
        } 
    }
      

  3.   

    ---不过这个文件里面有提到一些改进的地方... 我只看到了一句   //加载Temp类(如果要加载内存中的class文件-二进制码,需要自己写类加载器)