如何在 Java 中从字符串创建对象(如何评估字符串)?
我知道 eval 是“邪恶的”,但我使用它的方式是用户永远不能滥用它。
假设我有一个字符串“new Integer(5)”。 我想做一些事情,这样我就可以将一个变量(比如 foo)设置为 new Integer(5)。 就像
Integer foo;
String bar = "new Integer(5)"
*magic happens*
System.out.println(foo) -> 5
我环顾四周,看起来我有几个选择。 ToolProvider 中的 getSystemJavaCompiler() 方法可以做到这一点吗? 或者我应该使用 BeanShell 吗? 或者还有别的什么吗? 请注意,这是来自字符串,而不是文件。
I know eval is "evil", but I'm using it in a way that the user can't ever abuse it.
Let's say I've got a string "new Integer(5)". I want to do something such that I can set a variable, let's say foo, to new Integer(5). Something like
Integer foo;
String bar = "new Integer(5)"
*magic happens*
System.out.println(foo) -> 5
I've looked around and it looks like I have a few options. Can the getSystemJavaCompiler() method in ToolProvider do this? Or should I use BeanShell? Or is there something else? Note that this is from a string, not a file.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
这是通过使用 javax.tools 实现大部分目标的可能方法。 请注意,这段代码相当长,并且不完全是最有效或可移植的方法,但您应该明白这一点。
Here's a possible way to get most of the way there via using javax.tools. Note that this code is rather long and not exactly the most efficient or portable way to do this, but you should get the idea.
我会使用像 beanshell、jruby、jython 等脚本语言。
I would use a scripting language like beanshell, jruby, jython, etc.
您必须使用类似 Janino 的东西。
You'd have to use something like Janino.
这种事情是可能的,但对于像这样简单的任务来说,成本会非常高。 在此示例中,我会考虑使用 Class.forName() 将“Integer”映射到类,并且 Java 反射调用构造函数。
This kind of thing is possible, but it would be horrendously expensive for a task as simple as this. In this example, I'd consider using Class.forName() to map "Integer" to a class, and Java reflection invoke the Constructor.
Integer 类 采用 String在其构造函数中设置值,假设提供的字符串仅包含数字文本。
The Integer class takes a String in its constructor to set the value, assuming the provided string contains only numeric text.
Java 是一种静态类型语言,所以我认为你不能做到这一点。
Java is a statically typed language, so I don't think you can do that.
您可以使用 Java 脚本 API 。 默认语言是 JavaScript,但您可以插入任何语言。 但它需要 java 1.6。
You can use Java Scripting API. Default language is JavaScript, but you can plug in any language. it would require java 1.6 though.