我想知道是否可以编译,并运行存储的代码,而不生成exe或任何类型的其他文件,基本上从内存中运行该文件.
基本上,Main应用程序将有一些存储代码(可能会更改的代码),并且需要编译代码并执行它.没有创建任何文件.
创建文件,运行程序,然后删除文件不是一个选项.编译后的代码需要从内存中运行.
代码示例,或指针,或几乎任何东西都欢迎:)
如何从Java 5和Java 6中的任意字符串(在内存中)编译java代码,加载它并在其上运行特定方法(预定义)?
在你点燃之前,我查看了现有的实现:
我确信之前已经解决了这个问题,但我找不到任何看起来甚至是谷歌半生产质量的东西(除了jci,正如我之前所说,我还没有设法使用).
编辑:
Edit2:现在,我对BeanShell"评估"感到满意.显然它完成了我需要的所有东西(获取一个字符串,在'当前'类路径的上下文中评估它.它确实错过了一些Java 5特性,但它可以使用枚举(不定义)和编译'泛型'(擦除) )类,所以它应该足够我想要的.
我不想将答案标记为已接受,因为我希望有更好的解决方案出现.
Edit3:接受了beanshell建议 - 它真的很棒.
java compiler-construction runtime compilation runtime-compilation
在Java中,是否可以在应用程序运行时动态创建类定义,然后创建该类的对象?
例如,正在运行的应用程序将读入一个文本文件,该文件包含要包含在新类中的类成员列表.然后,应用程序将根据成员列表定义类定义,然后对其进行实例化.
这是我想要做的:
我希望能够既要做到这一点C,并C++使用gcc(并最终Java在类Unix系统(特别是Linux和Mac OS X)).我们的想法是基本上为这些语言实现一个read-eval-print循环,它们在输入时编译表达式和语句,并使用它们来修改现有的数据结构(在脚本语言中一直都是这样).我正在编写这个工具python,它生成C/ C++文件,但这不应该是相关的.
我已经探讨了使用共享库执行此操作,但了解到修改共享库不会影响已在运行的程序.我也尝试过使用共享内存但无法找到将函数加载到堆上的方法.我还考虑过使用汇编代码但尚未尝试这样做.
我宁愿不使用任何编译器,gcc除非绝对没有办法gcc.
如果有人有任何想法或知道如何做到这一点,任何帮助将不胜感激.
我CSharpCodeProvider用来编译我的应用程序的即时插件.
现在可以尝试编译一个看起来不错的文件,但会生成许多错误,例如粘贴二进制文件的C#代码.有许多字符,用处理error CS1056: Unexpected character.
这种行为是预期的,但是这种"恶意"文件的编译过程非常耗时.
我认为合理的一个解决方案是限制错误的数量,之后CSharpCodeProvider.CompileAssemblyFromFile返回.
是否可以设置这样的限制?
如果可以避免的话,我真的不想在第一时间仔细检查文件.
我最近在另一个关于C#运行时编译的网站上进行了简短的讨论,同时搜索了其他内容,并认为这个想法很有趣.你有没有用过这个?我试图确定如何/何时可以使用它以及它解决了什么问题.我会非常有兴趣听听你是如何使用它的,或者是在有意义的环境中.
非常感谢.
可能重复:
Scala中的"eval"
我知道scala是一种编译语言,但我也知道我可以动态地将类加载到jvm中,我可以在运行时调用scala编译器,最后但并非最不重要的是我也有一个很棒的repl,所以让scala作为一个脚本语言应该是可能的.
所以我需要运行一些任务:
简单解释:
val src = """ println("Hello World") """
interpret(src)
Run Code Online (Sandbox Code Playgroud)
调用外部函数:
object A{
def foo =
println("Hello World")
}
val src = """ A.foo """
interpret(src)
Run Code Online (Sandbox Code Playgroud)
实现功能:
trait T{
def foo:String
}
val src = """ class A extends T{ def foo = "Hello World" } """
interpret(src)
val t = loadClassAndCreatInstance.asInstanceOf[T]
println(t.foo)
Run Code Online (Sandbox Code Playgroud)
能够解决我所有的问题会很棒.
我成功地能够在运行时在Java中编译Groovy并将其存储在数据库中并将其拉出来.如果它有内部类或内部枚举,我无法编译Groovy类.有没有人成功编译这样的Groovy代码并包含内部类/枚举并能够通过类名拉出脚本?
例如,我想加载下面显示的包含内部类的"Test"脚本,并在运行时运行脚本.
编译代码:
public byte[] compileGroovyScript(final String className, final String script) {
byte[] compiledScriptBytes = null;
CompilationUnit compileUnit = new CompilationUnit();
compileUnit.addSource(className, script);
compileUnit.compile(Phases.CLASS_GENERATION);
for (Object compileClass : compileUnit.getClasses()) {
GroovyClass groovyClass = (GroovyClass) compileClass;
compiledScriptBytes = groovyClass.getBytes();
}
return compiledScriptBytes;
}
Run Code Online (Sandbox Code Playgroud)
拉出脚本的代码:
public Class getGroovyScript(final String className, final byte[] script) {
Class clazz = null;
try (GroovyClassLoader classLoader = new GroovyClassLoader(this.getClass().getClassLoader())) {
clazz = classLoader.defineClass(className, script);
} catch (IOException e) {
} catch (Exception e) {
}
return clazz; …Run Code Online (Sandbox Code Playgroud) 我理解如何在C#中使用Roslyn执行整个脚本,但我现在想要完成的是在脚本中编译一个类,实例化它,将其解析为接口,然后调用已编译和实例化的类实现的方法.
Roslyn是否公开了这样的功能?你能指点我这样的方法吗?
谢谢
我正在考虑建立一个在线C#解释器的想法,有点像Codepad.现在有明显的安全问题:
我对C#的了解并不是很微不足道,但我确信有很多关于它的知识,以及我没有想到的东西.你会注意什么?
一些精确,我计划在使用Mono的小型Linux VPS上运行它.
c# ×5
java ×3
c ×1
c++ ×1
classloader ×1
compilation ×1
gcc ×1
groovy ×1
interpreter ×1
linux ×1
on-the-fly ×1
optimization ×1
roslyn ×1
runtime ×1
scala ×1
scripting ×1
security ×1