【问题标题】:Can Java self-modify via user input?Java 可以通过用户输入进行自我修改吗?
【发布时间】:2012-01-10 23:25:23
【问题描述】:

我对允许用户输入修改进程和相应源的执行脚本感兴趣。

有哪些先例可以实现这样的结构?

【问题讨论】:

    标签: java theory


    【解决方案1】:

    我曾经编写了一个应用程序,它使用反射来允许由文本文件驱动测试。例如,如果您有这样的课程:

    class Tuner(String Channel) {
    
        tune(){...
        play(){...
        stop(){...
    }
    

    您可以通过以下代码执行方法:

    tuner=Channel 1
    tune tuner
    play tuner
    stop tuner
    

    它具有更多功能(您可以将对象传递给其他对象等),但大多数情况下,我使用它来驱动有线电视盒上的测试,其中完整的写入/构建/部署以进行测试的顺序为半小时。

    您可以创建一些可重用的类,并将它们与这种测试语言结合在一起,以创建一些非常复杂且易于创建的测试。

    那是一种 DSL,它不会通过消除括号并在随机位置添加下划线和点来让它看起来像一些奇怪的半英语,从而与您的松散语法语言胡闹。

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      是的,取决于意思。

      考虑像ObjectWeb ASM 这样的项目(请参阅the ASM 2.0 tutorial 了解一般纲要)。

      尝试发出需要反编译的 Java 源代码是另一回事:如果这是目标,那么也许应该编辑、重新编译源代码,并以某种方式加载/加载。 (这也是可能的,请考虑使用 JRebel 之类的工具。)

      编码愉快。

      【讨论】:

      • 所以在最坏的情况下它可以重新编译并运行一个新会话。有更好的吗?我认为它可以改为在会话结束时重新编译一次,并且在此之前只修改活动进程。
      • "在最坏的情况下" :) 如果 JRebel 仍然有试用版,我建议使用它。它没有提供代码/API,哦,那将是多么了不起的事情,但是您可以看到“动态”加载新的[已编译]类。现在,想象一下,如果不是程序员更新类源......(也有处理 Java 源代码/AST 的工具)。
      • @user474632 但是,如果这纯粹是一次学术冒险,我认为使用LISP 实现会带来更直接的收益。 LISP 在这方面具有优势,例如内置 eval 和代码即数据思维模式。 LISP 可以说是在 50 年代引入了元编程的整个概念!
      • 非常感谢您提供的 Wikipedia 链接,不久之后我找到了关于自托管的页面,该页面确实将 Java 包含在自托管语言列表中。
      【解决方案4】:

      您应该不能修改现有的类。但是如果你实现了 ClassLoader,那么你可以从非传统来源动态加载类:网络、XML 文件、用户输入、随机数生成器等。

      可能还有其他更好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-28
        • 1970-01-01
        相关资源
        最近更新 更多