希望有个 java 牛人帮我解决

问题描述

希望有个 java 牛人帮我解决
1、在 java 程序中如何让 String 中的字符串当作程序来运行
2、如何通过代码来让. java 文件编译成 class 字节码文件。
注 如果可以请附上代码,或者给出思路,小弟会十分感谢。
小弟初入此行半年,还没有c 币,希望大家支持下,谢谢

解决方案

我不是牛人,我的理解楼主的第一个问题,是不是想要个Js里的eval()方法,这是别人写的代码,直接上代码。哈哈
实现步骤:

1.自定义一个Java类,该Java类中定义一个方法来包含需要被运行的代码。
2.动态编译刚刚生成的Java源码,不在磁盘上生成源码,而是直接编译内存中的Java源码。
3.动态加载刚刚创建编译的Java二进制码,编译好的Java二进制码不是在磁盘上,而是放在内存中,并定义自己的类加载器,负责加载内存中的class文件。
4.通过反射运行前一步加载的类。

[java] view plaincopyprint?import java.util.Arrays;

import javax.tools.SimpleJavaFileObject;

import javax.tools.JavaFileObject;

import javax.tools.JavaCompiler;

import javax.tools.ToolProvider;

import javax.tools.DiagnosticCollector;

import java.net.URI;

public class MyClassLoader

extends ClassLoader

{

@Override

public Class<?> findClass(String str) throws ClassNotFoundException

{

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

//用于诊断源代码编译错误的对象

DiagnosticCollector diagnostics = new DiagnosticCollector();

//内存中的源代码保存在一个从JavaFileObject继承的类中

JavaFileObject file = new JavaSourceFromString(""Temp"" str.toString());

Iterable compilationUnits = Arrays.asList(file);

//建立一个编译任务

JavaCompiler.CompilationTask task = compiler.getTask(null null null null null compilationUnits);

//编译源程序

boolean result = task.call();

if (result)

{

return Class.forName(""Temp"");

}

return null;

}

}

class JavaSourceFromString extends SimpleJavaFileObject

{

private String name;

private String code;

public JavaSourceFromString(String name String code)

{

super(URI.create(""string:///"" + name.replace('.' '/') + Kind.SOURCE.extension) Kind.SOURCE);

this.code = code;

}

public CharSequence getCharContent(boolean ignoreEncodingErrors)  {      return code;  }  

}

import java.util.Arrays;
import javax.tools.SimpleJavaFileObject;
import javax.tools.JavaFileObject;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import javax.tools.DiagnosticCollector;
import java.net.URI;

public class MyClassLoader
extends ClassLoader
{
@Override
public Class<?> findClass(String str) throws ClassNotFoundException
{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//用于诊断源代码编译错误的对象
DiagnosticCollector diagnostics = new DiagnosticCollector();
//内存中的源代码保存在一个从JavaFileObject继承的类中
JavaFileObject file = new JavaSourceFromString(""Temp"" str.toString());
Iterable compilationUnits = Arrays.asList(file);
//建立一个编译任务
JavaCompiler.CompilationTask task = compiler.getTask(null null null null null compilationUnits);
//编译源程序
boolean result = task.call();
if (result)
{
return Class.forName(""Temp"");
}
return null;
}
}

class JavaSourceFromString extends SimpleJavaFileObject
{
private String name;
private String code;
public JavaSourceFromString(String name String code)
{
super(URI.create(""string:///"" + name.replace('.' '/') + Kind.SOURCE.extension) Kind.SOURCE);
this.code = code;
}

public CharSequence getCharContent(boolean ignoreEncodingErrors){    return code;}

}

public class Eval

{

public static Object eval(String str) throws Exception

{

StringBuffer sb = new StringBuffer();

sb.append(""public class Temp"");

sb.append(""{"");

sb.append("" public Object getObject()"");

sb.append("" {"");

sb.append("" "" + str + ""return new Object();"");

sb.append("" }"");

sb.append(""}"");

//调用自定义类加载器加载编译在内存中class文件

Class clazz = new MyClassLoader().findClass(sb.toString());

Method method = clazz.getMethod(""getObject"");

//通过反射调用方法

return method.invoke(clazz.newInstance());

}

public static void main(String[] args) throws Exception  {      Object rval = eval(""System.out.println(/""Hello World/"");"");      System.out.println(rval);  }  

}

解决方案二:
字符串怎么能当代码运行是不是你字符串里有别的代码啊

解决方案三:
String 就是一个程序的名称,这样它就可以当成程序(其实就是程序)来运行。
通过代码来实现编译,这是编译原理的实现。可以考虑:共有16款Java 编译器开源软件

解决方案四:
第一个问题不理解
第二个问题用javac就可以了

解决方案五:
1、如果String中的字符串本身就是程序名,可作为程序调用
2、javac实现编译

解决方案六:
第一个不太理解,是调用类吗?
Class clazz = Class.forName(""stirng类名"");
第二个可以用javac命令

解决方案七:
string当程序运行?Java程序吗?还是dos命令

解决方案八:
1.是动态生成String字符串吗,直接赋值就行了。
2.javac可以实现把.java 转换为.class字节码文件 ,可以用eclipsemyeclipse等工具直接编译运行类文件显示结果,之后可以在项目中找到相应的.class文件

解决方案九:
第一个问题我又百度了一个,你试试
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine se = manager.getEngineByName(""js"");
String str = ""1+2*(3+6)-5/2"";
Double result =(Double) se.eval(str);
System.out.println(result);

}

解决方案十:
第一个没太明白,第二个可以在jdk目录环境下用javac编译!!

时间: 2024-10-30 05:36:31

希望有个 java 牛人帮我解决的相关文章

java牛人交流群

问题描述 java牛人交流群if(你想学习java技术)try{加入179248815}//QQ群finally{你会成为大牛}

Blog list: JAVA牛人的BLOG

JAVA牛人的BLOG 兔八哥的BLOG: 不错的J2EE方面的东西 一亩三分地: java东东的blog James Gosling: on the Java Road: JAVA的老爸 Bruce Eckel: JAVA编程思想无人不知无人不晓 spring live: spring框架 raibledesigns: Appfuse作者 透明: 熊节

环境变量-关于android studio的问题,有没有人帮我解决啊。

问题描述 关于android studio的问题,有没有人帮我解决啊. android studio我已经安装好了.但是打开的时候 是这样的,我环境变量也弄好了. 但是为什么会这样啊???有没有人帮我解决一下,新人刚刚接触Android!!!! 解决方案 你的系统是64的,需要安装64bit的jdk 解决方案二: 环境变量有问题,找到javac里面的bin目录放进去,放到path里面,记得价格分号:再建一个classpath变量,值为一个"." .再用cmd试一下即可 解决方案三: 你

麻烦牛人帮我看一个C#做的图片管理系统,谢谢

问题描述 加我QQ52257810,帮我讲解一个做好的C#图片系统,要应付答辩,万分感谢! 解决方案 解决方案二:救命用的,感激不尽--解决方案三:带不带缩略图啊?解决方案四:b/s,还是c/s的??解决方案五:讲解一个系统?代码看不懂?解决方案六:够呛.解决方案七:哪里不懂再来问,光提需求,没有人有那么多的时间帮你写代码.解决方案八:要收费还可以,呵呵.lz要好好学习哦解决方案九:不会是楼主从网上down下来的东东吧解决方案十:晕解决方案十一:weborwinform..我记的我答辩的时候网上

求牛人帮我把这段代码改成C#的,谢谢

问题描述 #ifndefUSB_RELAY_DEVICE_H__#defineUSB_RELAY_DEVICE_H__#pragmacomment(lib,"setupapi.lib")#ifdef__cplusplusextern"C"{#endif//#pragmacomment(lib,"setupapi.lib")#ifdef_WIN32#defineEXPORT_API__declspec(dllexport)#else#defineE

各位JXTA牛人帮个忙,小弟刚接触JXTA!

问题描述 我刚学JXTA,有很多不懂的问题想请教,哪位大哥大姐掌握的比较好的能否和小弟交流一下我QQ448922106

ASP宿舍分配代码!牛人帮下忙!在线等!

问题描述 protectedvoidButton1_Click(objectsender,EventArgse){Stringstr="insertintoZhusu(xuesheng_ID,xingming,xingbie,danwei,zhuanye,banji)selectxuesheng_ID,xingming,xingbie,danwei,zhuanye,banjifromXuesheng";//groupbyxuesheng_ID,xingming,xingbie,danw

这个问题我在传智播客问了N次,没能解决,看看这里有没有人帮我解决

问题描述 两个月前,给一个开学校的朋友弄一个网站,因为在跟着传智学习.net的一些课程,所以决定用学到的知识去解决这个项目.中间虽然有过一些困难,但通过自己动力,及苦研教程,基本都解决了.可就在后半程,还是出现一个问题,就是整个网站在本机运行都正常,即通过vs2010直接调试的模式,用vs自带的虚拟服务器.然后用IIS直接连接到vs指定的项目文件夹,开始不可以,后来设置一下,也可以了.到这步,我信习满满,就是将vs下默认的项目包直接上传到服务器上了(实体服务器,我们公司负责维护一个政府机构的服务

求牛人告知如何解决jsp的问题

问题描述 想做一个修改库存的代码,结果运行后也不报错但就是无法得出结果.这是小弟impl中的方法//修改库存publicbooleanmodifyBook(intbid,intcount){booleanflag=false;Stringsql="updatebookssetstock=stock-"+count+"wherebid="+bid;Connectionconn=this.getConnection();try{Statementst=conn.crea