李刚老师的java版本的eval方法(希望高手加以改进) 不过这个文件里面有提到一些改进的地方...目前我的水平还不够,希望各位高手加以改进1 . 不需要生成临时文件...源代码注释有说2 . 返回值的问题...3 . 导入包的问题... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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()); } } 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()); } } ---不过这个文件里面有提到一些改进的地方... 我只看到了一句 //加载Temp类(如果要加载内存中的class文件-二进制码,需要自己写类加载器) 关于synchronized和assert 这样用PreparedStatement 是否是线程安全的? JTextField构造的文本框输入中文出错 谁能解释下这个结果 数据库连接问题? 还要请大家帮忙看一下,为什么我的代码在JDK1.408上可以通过并运行,但在JDK1.5中可以编译,但运行就出错呢? 新开通第一问:关于JNI原理。 为什末我的IE不能支持java? 不让用户选择文件,程序指定本地文件,Java可以实现上传到服务器吗? 谁能把速度给我提上去,我。。。 关于线程 怎么添加背景之后就把原来的Panel覆盖了啊!
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());
}
}
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());
}
}