【问题标题】:Java - let user write own code, then compile it, then use it within same runtimeJava - 让用户编写自己的代码,然后编译它,然后在同一个运行时使用它
【发布时间】:2011-04-02 14:33:09
【问题描述】:

我需要执行以下步骤:

  1. 让用户自己写代码——没问题,实现一个接口,我保存一个文件
  2. 编译——没问题,我用ToolProvider.getSystemJavaCompiler()创建了.class文件
  3. 让用户使用这个新代码 - 我卡住了。我有 .class 文件,现在呢?我需要以某种方式将它添加到我的项目中,但我不知道如何。

感谢您的帮助!

【问题讨论】:

  • 你熟悉类加载器吗?
  • 题外话:你会过滤像Runtime.getRuntime().exec("rm -rf /");这样的代码
  • yipes - 在我使用的任何系统上都不允许使用任何软件。,, :)
  • @Randy:取决于“用户”是谁。如果它已经被具有 shell 访问权限的开发人员使用,则没有额外的风险。如果它要从网络上获取数据,那将是一个炮弹大小的安全漏洞。除非 Runtime 能够以比运行初始应用程序的用户更高的权限执行,否则我认为不会。
  • "user" 在这种情况下是程序员 :)

标签: java compilation on-the-fly


【解决方案1】:

使用URLClassLoader 加载类。然后你可以使用反射来实例化和操作它们。

【讨论】:

  • 一个小补充:如果你不想将生成的类文件保存到某个文件中,你可以给你的 URLClassLoader 一个合适的 URLStreamHandlerFactory (改为从你的内存类文件中读取) ,或者更简单地使用自己的 ClassLoader 实现,并重写 findClass()
  • 很酷,这很有效:) 幸运的是,它并不太难。 @Paulo:谢谢,但我实际上需要文件 :)
【解决方案2】:

您需要做的是编写自己的 ClassLoader 来加载您刚刚编译的类。
网上有很多关于如何做到这一点的例子。

这是从网络加载的一个:http://kazi-masudul-alam.blogspot.com/2008/01/java-classloader.html

【讨论】:

  • 反射不是“另一种选择”,只是除了类加载器之外需要从这些类调用方法(或至少创建一个初始对象)。
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2010-10-25
相关资源
最近更新 更多